diff --git a/.github/workflows/aurora-enhancements.yml b/.github/workflows/aurora-enhancements.yml index 1f60b9ce7..b3eb2bc59 100644 --- a/.github/workflows/aurora-enhancements.yml +++ b/.github/workflows/aurora-enhancements.yml @@ -16,7 +16,7 @@ on: profile: description: Kernel profile (eGPU remains an unqualified experiment) type: choice - options: [candidate, egpu, unified72] + options: [candidate, egpu, unified72, unified72-egpu] default: candidate permissions: @@ -34,7 +34,7 @@ jobs: strategy: fail-fast: false matrix: - profile: ${{ github.event_name == 'workflow_dispatch' && fromJSON(format('["{0}"]', inputs.profile)) || fromJSON('["candidate","unified72"]') }} + profile: ${{ github.event_name == 'workflow_dispatch' && fromJSON(format('["{0}"]', inputs.profile)) || fromJSON('["candidate","unified72","unified72-egpu"]') }} steps: - uses: actions/checkout@v7 - name: Install native build tools diff --git a/mseries/OS9-HANDOFF.md b/mseries/OS9-HANDOFF.md index 8c0856574..7bf55b604 100644 --- a/mseries/OS9-HANDOFF.md +++ b/mseries/OS9-HANDOFF.md @@ -1,3 +1,62 @@ +## Monitor restore and wip4 deployment gate — 2026-10-26 + +The WD22TB4 picture returned after the owner moved the cable from rear-left to front-left. The live AOC is DP-2, +1920×1080/60, and current kernel output shows a successful modeset on the alternate DCP. This confirms the workaround, +not same-port recovery or repeat plug/unplug reliability. The deployed display-profile watcher had two D-Bus tuple +signature defects; both are fixed in [PR #601](https://github.com/techmore/ElementaryOS_MSeries/pull/601), the watcher +was restarted without restarting Wingpanel/compositor, and the AOC profile now matches. Actual post-fix +`ApplyMonitorsConfig` was then applied manually and succeeded; the AOC profile matches and the live mode remains 1920×1080/60. The automatic physical unplug/replug restore path is still unverified. Keep the working front-left connection in place. + +Per owner's sequencing request, WIP4/upstream review is happening before another cable cycle. The refreshed 2026-10-26 scan covers Aurora #186, #163, #9, #154, #157, #170, and issue #130. No new narrow fix is ready to add: #186 overlaps local patch 0002 in `dcp-fabric.c`; #163 is a TIPD USB-preservation fix and conflicts with #186; #9 is a broad older tunnel implementation while the pinned source already has tunnel support; #154 is for simultaneous tunnels; #157 is already patch 0001; #170 and #130 do not match this hotplug trigger. Keep the WIP4 source pin unchanged. Details: `aurora/unified72/upstream-review-2026-10-26.md`. + +WIP4 preparation is now concrete: the run 39944207967 package/source/provenance passed artifact/checksum review, and an +offline trial bundle is staged privately at `/home/sdolbec/aurora-wip4-trial-20261026-v2/`. It includes candidate +vmlinuz/initrd, the proposed GRUB entry, current `boot.bin` as byte-exact rollback, package/source inputs and provenance. +The proposed config retains `.20` as persistent default; `grub-script-check` and the initramfs root-unlock/module audit +passed. Receipt: `aurora/unified72/boot-preflight-wip4-2026-10-26/preparation.json`. No kernel package, bootloader, +live GRUB config or shared boot payload was changed. Next: review rollback accessibility/fallback compatibility and, +for a hardware trial, obtain explicit owner approval for the attended boot. Then qualify dock retry/restore with the +watcher fix. Do not claim permanent recovery from the current picture alone. + +## wip4 finalized with Aurora20 ports — 2026-10-22 (Codex) + +Owner requested the six Aurora20 enhancements be ported into wip4 and asked for an upstream audit relative to the +J314S/M1 Pro + WD22TB4 HDMI setup. The integration branch pins the same unmerged Aurora 7.2.11 #158 tree and #157 +display patch, retains the local DCP timeout recovery patch, and adds the six Aurora20 ports. Normal wip4 keeps +AMDGPU/Nouveau disabled; `unified72-egpu` is a distinct optional profile/package. The M3 thermal fallback is a +7.2.11-adapted policy helper and host control only: the M3 backend still refuses runtime startup. + +- Exact-source `prepare` succeeded for `unified72` and `unified72-egpu`; all selected patches applied in manifest + order. `candidate.py check` passed 9 PMP bootargs, 3 PMP power and 20 M3 runtime/thermal policy host controls for + each profile, plus the MacSMC production discovery harness (all-readable and 65 failure cases under ASan/UBSan). + Aurora Python admission suite passed 83/83. +- Owner relevance: the sRGB/DCP changes target the WD22TB4 display path. udmabuf and optional SMC-property discovery + are generic/conditional. M3 thermal, J613/T8122 cameras and eGPU are not J314S-qualified; camera firmware/m1n1 + prerequisites are recorded in `aurora/unified72/AURORA20-PORT-AUDIT-2026-10-22.md`. +- **Built, not booted.** ARM64 candidate, normal wip4 and wip4-eGPU Image/modules/DTBs builds and package-boundary + inspections passed in [run 39854228647](https://github.com/techmore/ElementaryOS_MSeries/actions/runs/39854228647). + DCP KUnit and hardware checks remain open. wip3 stays installed and running, `.20` remains the persistent default, + and no boot payload was staged or armed. +- Upstream #158/#157 and Aurora #135/#134/#119 remain open; #67 is an open draft. Heads and local hashes are recorded + in the audit/series manifests. The review branch is [PR #533](https://github.com/techmore/ElementaryOS_MSeries/pull/533). + Next hardware gate is a separate attended wip4 trial with matched boot-chain/rollback review. + +## Dock monitor dark on wip3: dcpext1 DPTX stall, wip4 draft patch — 2026-10-22 (Claude Code) + +Owner plugged the WD22TB4 on the running wip3 trial kernel; no picture. Dock USB/Thunderbolt fine; `28cc00000` (dcpext1) never +answered `validate DPTX target` (six attempts), its release then timed out too, and replugging the same port failed again +(`DP tunnel setup failed: -110`). Moving the dock to another USB-C port routed it to `289c00000` and gave 1080p/60 at once. +Full timeline, what is and is not shown: `mseries/aurora/hardware-tests/2026-10-22-j314s-wip3-dcpext1-dptx-wedge.md`. + +- **Cause (partly shown).** The pinned source keeps a Thunderbolt route owned when its release is refused; a timeout is + treated as a refusal, so the port stays on the dead pipeline. Why `28cc00000` was picked first and why it went silent: not shown. +- **Draft.** wip4 candidate (`unified72/series.json` revision 5, `patches/0002-...`). Build-only: patch applies on the pinned + files, routing logic exercised in userspace; kernel build, KUnit and every boot are open. wip3 untouched, nothing staged. +- **Workaround on wip3.** Use a different USB-C port; reboot clears a pinned port. +- **Side note.** Audio blips on dock plug/unplug coincide with `mseries-power` re-applying the CPU profile on each AC flip; one logged + ALSA underrun at the first plug. Not investigated further. +- **Next.** CI native build of the PR, then owner decides on unarmed staging; design the same-plug re-request on the Thunderbolt side. + ## Bounded Aurora CI dependency downloads — 2026-10-22 The unified72 check spent 47m17s fetching 144 MB from the Azure Ubuntu @@ -77,6 +136,20 @@ unqualified until the session package is installed and the next login.** card; typing shows dots; Caps Lock shows the warning; your password unlocks. If it misbehaves: `Environment=PANTHEON_LOCK_COMMAND=gtklock` drop-in restores the stock look. +## Aurora pinned-source fetch follow-up — 2026-10-22 + +PR #518's unified72 run [39770268111](https://github.com/techmore/ElementaryOS_MSeries/actions/runs/39770268111) and PR #528's +first retry run [39836069576](https://github.com/techmore/ElementaryOS_MSeries/actions/runs/39836069576) both stopped at +pinned-source preparation on repeated codeload HTTP 429 responses. The retry logic honored the bounded attempt/delay +policy; the candidate profile passed source preparation and entered its isolated CI kernel build, while unified72 did +not. This follow-up keeps the codeload checksum path, then falls back only for retryable HTTP errors to the explicitly +pinned Git URL, commit and tree SHA-1 in `unified72/series.json`; it verifies both Git identities before archiving. Bad +checksums and permanent HTTP errors still fail closed. The preparation receipt records the acquisition method and actual +archive digest. Local tests cover retry and fallback behavior; they do not +prove the remote Git fetch or a wip4 build. No source archive was fetched/prepared locally, and no hardware, installed +kernel, boot payload or wip4 artifact was produced. PR #518 remains conflicted with `dev` and unreviewed. Next: let the +updated CI validate the fallback and record candidate/unified72 build outcomes separately. + ## Compositor: lock screen shows typing again; lock on idle — 2026-10-22 (Claude Code) Owner: "the screen saved to login comes up … there is no keyboard feedback", and asked for lock on idle honouring diff --git a/mseries/ROADMAP.md b/mseries/ROADMAP.md index 7e73f6e4d..331a82245 100644 --- a/mseries/ROADMAP.md +++ b/mseries/ROADMAP.md @@ -1,3 +1,26 @@ +## Monitor restore + WIP4 deployment gate — 2026-10-26 + +The WD22TB4 picture returned on front-left after failing on rear-left. The profile watcher D-Bus tuple defects are fixed +in PR #601; manual profile application succeeds, while automatic unplug/replug recovery remains unverified. Per owner sequencing, finish +WIP4/upstream preparation before another cable test. The refreshed scan also covered #9, #154, #157, #170 and issue #130. No new narrow fix is ready to add: #186 overlaps the local DCP patch; #163 conflicts with #186 and preserves dock USB rather than recovering a tunneled display; #9 is a broad older tunnel implementation already represented in the pinned source; #154 concerns simultaneous tunnels; #157 is already included; #170 and #130 have different triggers. Keep the source pin unchanged. See [2026-10-26 upstream scan](aurora/unified72/upstream-review-2026-10-26.md). Pinned #158 merged unchanged. Exact ARM64 artifact 39944207967 is now checksum-audited and its private offline trial +bundle is staged at `/home/sdolbec/aurora-wip4-trial-20261026-v2/`; candidate initrd/vmlinuz, proposed GRUB config, +package/source/provenance and byte-exact shared-boot rollback are included. `.20` stays the proposed persistent default. +No kernel package, live GRUB config or boot payload has been changed. Review rollback access/fallback compatibility, +then get owner approval for an attended trial and repeat recovery qualification. Receipt: +`aurora/unified72/boot-preflight-wip4-2026-10-26/preparation.json`. +See [handoff](OS9-HANDOFF.md) and [upstream audit](aurora/unified72/AURORA20-PORT-AUDIT-2026-10-22.md). + +## Aurora 7.2.11 wip4 port set built — 2026-10-22 + +Wip4 revision 6 now carries the J314S-targeted external-display/DCP series plus all six requested Aurora20 +enhancements, checked in order against the exact pinned #158 source. The eGPU modules are limited to a separately +named opt-in profile; the M3 thermal policy port is dormant while M3 runtime startup is refused. Exact upstream states, +firmware scope and J314S relevance are in [the port audit](aurora/unified72/AURORA20-PORT-AUDIT-2026-10-22.md). +Both normal and eGPU source preparation and all production host controls pass; the 83 Aurora admission tests pass. +ARM64 candidate, unified72 and unified72-eGPU kernel/module/DTB builds and package inspections passed in +[run 39854228647](https://github.com/techmore/ElementaryOS_MSeries/actions/runs/39854228647). DCP KUnit and hardware +acceptance remain open. Nothing was installed or staged. Review branch: [PR #533](https://github.com/techmore/ElementaryOS_MSeries/pull/533). + ## Bounded Aurora CI dependency downloads — 2026-10-22 The unified72 check spent 47m17s fetching 144 MB from the Azure Ubuntu @@ -115,6 +138,17 @@ suspend and controlled power remain open. Read latest handoff before proceeding. # Roadmap, features and follow-ups (MacBook Pro 14" M1 Pro, elementary OS 9 on Asahi) + +## Pinned Aurora source fetch follow-up — 2026-10-22 + +Both #518 run 39770268111 and #528 run 39836069576 received repeated HTTP 429 responses from the pinned codeload URL; +the retry policy exhausted before unified72 source preparation. The candidate profile passed prep and entered its isolated +CI build. The current follow-up retains archive SHA-256 verification, retries transient responses, then uses the exact +Git URL, commit and tree SHA-1 pinned in `aurora/unified72/series.json` only after a retryable HTTP error. Mocked checks +cover both paths, and the preparation receipt records the acquisition method and archive digest; the remote fallback and +wip4 build still need CI evidence. No local source fetch or hardware/kernel +installation occurred. #518 remains conflicted with `dev` and unreviewed; verify updated CI before considering its refresh. + ## Factory speaker protection wired into ARM64 images — 2026-10-21 Ubuntu Resolute `speakersafetyd` 1.1.2-4 now ships in the Apple Silicon overlay, diff --git a/mseries/aurora/README.md b/mseries/aurora/README.md index b07e51982..d2764fe88 100644 --- a/mseries/aurora/README.md +++ b/mseries/aurora/README.md @@ -24,12 +24,14 @@ replace the historical "not booted" descriptions below for current status. The first freeze is **experimental**, with boot/PMP/idle-accounting evidence; full hardware and energy acceptance remains incomplete. The [energy port plan](ENERGY-PORT-PLAN-2026-10-18.md) audits 52 branches and -12 open PR heads and introduces a separate [7.2.10 WIP build](unified72/README.md). +12 open PR heads and introduces the separate [7.2.11 wip4 build](unified72/README.md). For the newer source-build enhancement candidate (udmabuf, scoped M3 thermal/ camera fixes and SMC battery-reporting hardening), see [enhancements](enhancements/README.md). It has a separate kernel/package identity; the fixed `.20` installer and staging instructions below do not deploy it. +The Aurora20 ports are also audited against the separate [7.2.11 wip4 series](unified72/README.md), with owner-device +relevance and firmware/eGPU gates in its [port audit](unified72/AURORA20-PORT-AUDIT-2026-10-22.md). This opt-in lane follows **omacom/linux-aurora release `aurora-2026.10.17.20`**, kernel source diff --git a/mseries/aurora/candidate.py b/mseries/aurora/candidate.py index 169e0b714..57a26b5d8 100644 --- a/mseries/aurora/candidate.py +++ b/mseries/aurora/candidate.py @@ -12,18 +12,123 @@ import subprocess import tarfile import tempfile +import time +import urllib.error import urllib.request +from email.utils import parsedate_to_datetime from release import HERE, PINS, asset, extract, sha256, validate_kernel ENHANCEMENTS = HERE / "enhancements" MANIFEST = ENHANCEMENTS / "series.json" +SOURCE_DOWNLOAD_ATTEMPTS = 4 +MAX_SOURCE_RETRY_DELAY = 30 +RETRYABLE_SOURCE_HTTP_ERRORS = {429, 500, 502, 503, 504} + + +def source_retry_delay(error, attempt): + """Return a bounded retry delay, or None when Retry-After exceeds our wait budget.""" + retry_after = error.headers.get("Retry-After") if error.headers else None + if retry_after: + try: + delay = float(retry_after) + except ValueError: + try: + delay = parsedate_to_datetime(retry_after).timestamp() - time.time() + except (OverflowError, TypeError, ValueError): + delay = None + if delay is not None: + delay = max(0.0, delay) + return delay if delay <= MAX_SOURCE_RETRY_DELAY else None + return min(float(2 ** (attempt + 1)), float(MAX_SOURCE_RETRY_DELAY)) + + +def download_pinned_source(url, destination, *, attempts=SOURCE_DOWNLOAD_ATTEMPTS): + """Download an immutable source archive with bounded HTTP 429/5xx retries.""" + if attempts < 1: + raise ValueError("source download attempts must be positive") + for attempt in range(attempts): + try: + with urllib.request.urlopen(url, timeout=120) as source, Path(destination).open("wb") as target: + shutil.copyfileobj(source, target) + return + except urllib.error.HTTPError as error: + if error.code not in RETRYABLE_SOURCE_HTTP_ERRORS or attempt + 1 >= attempts: + error.close() + raise + delay = source_retry_delay(error, attempt) + if delay is None: + error.close() + raise + print(f"Pinned source download returned HTTP {error.code}; retrying in {delay:g}s", flush=True) + error.close() + time.sleep(delay) def run(*args, **kwargs): subprocess.run([str(arg) for arg in args], check=True, **kwargs) +def fetch_pinned_source_from_git(source_pin, destination): + """Archive an exact Git commit after verifying its commit and tree pins.""" + required = ("git_url", "commit", "git_tree_sha1", "archive_root") + if any(not source_pin.get(key) for key in required): + raise ValueError("pinned source has no complete Git fallback identity") + with tempfile.TemporaryDirectory(prefix="aurora-pinned-source-") as temporary: + repository = Path(temporary) / "repository" + run("git", "init", "--quiet", "--initial-branch=source", repository) + run("git", "-C", repository, "fetch", "--quiet", "--depth=1", "--no-tags", + source_pin["git_url"], source_pin["commit"]) + commit = subprocess.run(["git", "-C", str(repository), "rev-parse", "FETCH_HEAD"], + check=True, capture_output=True, text=True).stdout.strip() + if commit != source_pin["commit"]: + raise ValueError("Git source fallback resolved a different commit") + tree = subprocess.run(["git", "-C", str(repository), "rev-parse", "FETCH_HEAD^{tree}"], + check=True, capture_output=True, text=True).stdout.strip() + if tree != source_pin["git_tree_sha1"]: + raise ValueError("Git source fallback tree checksum mismatch") + run("git", "-C", repository, "archive", "--format=tar", + f"--prefix={source_pin['archive_root']}/", f"--output={destination}", "FETCH_HEAD") + + +def obtain_pinned_source(source_pin, cache, offline): + """Return (archive path, cleanup path) for a checksum-verified pinned source.""" + path = Path(cache) / source_pin["name"] + if path.exists(): + if sha256(path) != source_pin["sha256"]: + raise ValueError("unified source checksum mismatch") + return path, None + if offline: + raise ValueError(f"missing cached input: {path}") + path.parent.mkdir(parents=True, exist_ok=True) + temporary = path.with_name(f".{path.name}.part") + fallback = path.with_name(f".{path.name}.git.tar.part") + temporary.unlink(missing_ok=True) + fallback.unlink(missing_ok=True) + try: + try: + download_pinned_source(source_pin["url"], temporary) + except urllib.error.HTTPError as error: + if error.code not in RETRYABLE_SOURCE_HTTP_ERRORS or not source_pin.get("git_url"): + error.close() + raise + print(f"Pinned source codeload remained HTTP {error.code}; trying the exact Git tree", + flush=True) + error.close() + try: + fetch_pinned_source_from_git(source_pin, fallback) + except Exception: + fallback.unlink(missing_ok=True) + raise + return fallback, fallback + if sha256(temporary) != source_pin["sha256"]: + raise ValueError("unified source checksum mismatch") + temporary.replace(path) + return path, None + finally: + temporary.unlink(missing_ok=True) + + def tree_digest(root): """Bind every source file, executable bit and symlink, not only patch hunks.""" root = Path(root) @@ -40,7 +145,7 @@ def tree_digest(root): def manifest(profile): - return HERE / "unified72/series.json" if profile == "unified72" else MANIFEST + return HERE / "unified72/series.json" if profile in ("unified72", "unified72-egpu") else MANIFEST def series(profile="candidate"): @@ -58,7 +163,7 @@ def settings(data, profile): result = dict(data["config"]["candidate"]) # Explicitly retain the release's disabled eGPU drivers in the normal candidate. result.update(DRM_AMDGPU="n", DRM_NOUVEAU="n") - if profile == "egpu": + if profile in ("egpu", "unified72-egpu"): result.update(data["config"]["egpu"]) result.update(LOCALVERSION='""', LOCALVERSION_AUTO="n") return result @@ -112,36 +217,31 @@ def prepare(cache, output, profile, offline): # Verify both original inputs before creating the output directory. inputs = {"recipe": asset(cache, "recipe", offline=offline)} source_pin = data.get("source") + temporary_source = None if source_pin: - path = Path(cache) / source_pin["name"] - if not path.exists(): - if offline: - raise ValueError(f"missing cached input: {path}") - path.parent.mkdir(parents=True, exist_ok=True) - temporary = path.with_suffix(path.suffix + ".part") - try: - with urllib.request.urlopen(source_pin["url"], timeout=120) as src, temporary.open("wb") as dst: - shutil.copyfileobj(src, dst) - if sha256(temporary) != source_pin["sha256"]: - raise ValueError("unified source checksum mismatch") - temporary.replace(path) - finally: - temporary.unlink(missing_ok=True) - if sha256(path) != source_pin["sha256"]: - raise ValueError("unified source checksum mismatch") - inputs["source"] = path + inputs["source"], temporary_source = obtain_pinned_source(source_pin, cache, offline) else: inputs["source"] = asset(cache, "source", offline=offline) - root = fresh(output) - upstream = source_pin["archive_root"] if source_pin else "aurora-linux-" + PINS["kernel_source"] - extract(inputs["source"], root, (upstream,)) + source_fetch_method = "release-asset" + if source_pin: + source_fetch_method = "pinned-git-tree" if temporary_source else "pinned-archive-sha256" + source_archive_sha256 = sha256(inputs["source"]) + try: + root = fresh(output) + upstream = source_pin["archive_root"] if source_pin else "aurora-linux-" + PINS["kernel_source"] + extract(inputs["source"], root, (upstream,)) + finally: + if temporary_source: + temporary_source.unlink(missing_ok=True) source = root / "source" (root / upstream).rename(source) recipe = root / "recipe" extract(inputs["recipe"], recipe, ("config", "PKGBUILD", "rust-toolchain.toml", "linux-aurora-phram.conf")) if sha256(recipe / "config") != PINS["recipe_config_sha256"]: raise ValueError("upstream recipe config mismatch") - selected = [patch for patch in data["patches"] if patch["profile"] == "candidate" or profile == "egpu"] + egpu_profile = profile in ("egpu", "unified72-egpu") + selected = [patch for patch in data["patches"] + if patch["profile"] == "candidate" or (patch["profile"] == "egpu" and egpu_profile)] modified = set() for patch in selected: path = manifest(profile).parent / "patches" / patch["file"] @@ -170,6 +270,8 @@ def prepare(cache, output, profile, offline): receipt = {"profile": profile, "kernel_release": data["kernel_release"][profile], "base_pins": PINS, "series_sha256": sha256(manifest(profile)), "patches": selected, "source_pin": source_pin, + "source_fetch_method": source_fetch_method, + "source_archive_sha256": source_archive_sha256, "source_tree_sha256": tree_digest(source), "modified_files": {name: sha256(source / name) for name in sorted(modified)}, "prepared_config_sha256": sha256(root / "build/.config"), @@ -204,8 +306,7 @@ def check(root): binary = Path(temporary) / f"production-tests-{index}" run("rustc", "--edition=2021", "--test", "-D", "warnings", source / test, "-o", binary, cwd=root) run(binary) - if receipt["profile"] != "unified72": - run("python3", ENHANCEMENTS / "check-macsmc.py", source) + run("python3", ENHANCEMENTS / "check-macsmc.py", source) def build(root, output, jobs): @@ -251,7 +352,9 @@ def make(*targets): validate_kernel(payload, actual) modprobe = payload / "usr/lib/modprobe.d" modprobe.mkdir(parents=True) - name = data.get("debian_package", "linux-image-elementary-aurora-enhancements" + ("-egpu" if receipt["profile"] == "egpu" else "")) + name = data.get("debian_packages", {}).get(receipt["profile"], + data.get("debian_package", "linux-image-elementary-aurora-enhancements" + + ("-egpu" if receipt["profile"] == "egpu" else ""))) # A shared filename would make dpkg reject co-installation with .20 # (or the other candidate profile), even when its content is identical. shutil.copy2(root / "recipe/linux-aurora-phram.conf", modprobe / f"{name}-phram.conf") @@ -266,7 +369,8 @@ def make(*targets): (docs / "README").write_text("Experimental source-built kernel. No maintainer scripts or /boot files.\n" "Not supported by the fixed-release Aurora20 installer/stager.\n" "Hardware qualification and a matched boot-chain review are required.\n") - version = data.get("debian_version", "7.1.12+elementary.aurora20.enh1-1") + version = data.get("debian_versions", {}).get(receipt["profile"], + data.get("debian_version", "7.1.12+elementary.aurora20.enh1-1")) size = sum(path.stat().st_size for path in payload.rglob("*") if path.is_file()) // 1024 (control / "control").write_text(f"Package: {name}\nVersion: {version}\nArchitecture: arm64\n" "Maintainer: ElementaryOS MSeries contributors \n" @@ -300,7 +404,7 @@ def main(): prep = commands.add_parser("prepare") prep.add_argument("--cache", type=Path, required=True) prep.add_argument("--output", type=Path, required=True) - prep.add_argument("--profile", choices=("candidate", "egpu", "unified72"), default="candidate") + prep.add_argument("--profile", choices=("candidate", "egpu", "unified72", "unified72-egpu"), default="candidate") prep.add_argument("--offline", action="store_true") for command in ("check", "build"): sub = commands.add_parser(command) diff --git a/mseries/aurora/hardware-tests/2026-10-22-j314s-wip3-dcpext1-dptx-wedge.md b/mseries/aurora/hardware-tests/2026-10-22-j314s-wip3-dcpext1-dptx-wedge.md new file mode 100644 index 000000000..8a788266b --- /dev/null +++ b/mseries/aurora/hardware-tests/2026-10-22-j314s-wip3-dcpext1-dptx-wedge.md @@ -0,0 +1,119 @@ +# J314S wip3: first dock plug lands on a silent dcpext1 — 2026-10-22 + +Diagnosis by Claude Code on the owner's J314S (MacBook Pro 14-inch, M1 Pro), running the trial kernel +`7.2.11-elementary-aurora72-wip3` (up since 2026-10-21 16:42 EDT; `apple_sep.xart_guard=0`), with the Dell WD22TB4. +Owner report: the dock's monitor did not come on. The diagnosis changed nothing on the host. Times are EDT on 2026-10-22. + +## Result + +The dock's Thunderbolt link, USB hubs, Ethernet and HID all came up. The DisplayPort side did not, and could not be +recovered by replugging into the same port. It worked at once on a different port. The fix drafted for it +(`unified72/patches/0002-...`) is **build-only and unproven**: nothing here was compiled into a kernel or booted. + +## Timeline + +| Time | Event | +| --- | --- | +| 07:04:23 | `mseries-power` runs (AC arrived); `38bc` (panel) power-cycles; `289c00000` logs `dcp_dptx_disconnect(port=0)` and `connected:0`. | +| 07:04:27.95 | Dock `thunderbolt 0-1` authorised. `28cc00000` (dcpext1): `allocated Type-C DPTX PHY 0`, `display routed to Thunderbolt DP tunnel dpin0`. | +| 07:04:29–07:04:39 | Six attempts (the first plus five retries), two seconds apart (1 s timeout, 1 s delay): `AppleDCPDPTXRemotePort (chan:1) command type 0xc0 ... timed out after 1000 ms`, `service call group 0 cmd 12 failed ... -110`, `dcp_dptx_connect: failed to validate DPTX target 0:0: -110`. Then `Type-C DPTX reconnect failed after 5 retries: -110`. | +| 07:04:40–41 | `dcp_hotplug() connected:0`; teardown: `group 8 cmd 8 failed ... -110`, `dpin0: display teardown failed: -110`. | +| 07:10:40–50 | Owner unplugs and replugs the **same** port. Dock re-enumerates on Thunderbolt. | +| 07:10:51–52 | `28cc00000` again; a `group 8 cmd 8` call times out; `dpin0: DP tunnel setup failed: -110`. 07:11:03 `0:5 <-> 1:14 (DP): not active, tearing down`. | +| 07:12:21–27 | Owner moves the dock to **another** port. `289c00000` (dcpext0): `allocated Type-C DPTX PHY 1`, `DCPDP13Service` appears in 26 ms, `connected:1`, 1920x1080@60, `card2-DP-2 connected`. | + +## What the evidence supports + +1. **dcpext1's DPTX RemotePort service stopped answering.** `validate` (cmd 12) timed out on all six attempts; the later + release (cmd 8, group 8) timed out too, in the same state and on the next plug. Nothing on `289c00000` timed out. +2. **The failed port stays pinned.** In `dcp_tb_release_locked()` (drivers/gpu/drm/apple/dcp-fabric.c at the pinned + source), a failing `dcp_dptx_disconnect_oob()` returns before the route is freed; the comment there says the + route "stays owned for the next request to release". A timeout is not a refusal, and the next request + (07:10:51) hit the same timeout in that same release. That matches `DP tunnel setup failed: -110` appearing + one second after `group 8 cmd 8 failed`. The port that was moved to was a different `apple_dcp_typec_port`, so + it did not inherit the stuck ownership. +3. **The kernel does not look at the other display controller.** After the failed validates nothing tried + `289c00000` for that plug. +4. **The same failure is not new in wip3's source.** `dcp.c`, `dptxep.c`, `dcp-fabric.c` and `dcp-fabric-core.c` are + unchanged between the wip2 pin (`644133b7`) and the wip3 pin (`bd526b3c`) (the first three fetched at both + refs and compared by size and by the GitHub compare file list; `dcp.c` by the compare list only); only `apple_drv.c`, + `iomfb_plane.h`, `iomfb_template.c`, `plane.c` and `plane.h` differ in `drivers/gpu/drm/apple/` (GitHub compare). + So this is not a wip3 regression in the code that decides routing or talks to the DPTX service. (It remains + possible that something outside those files changed the firmware's behaviour; not shown.) +5. **Earlier boots never hit it.** In boots −4 to −7 (wip2 and `.20-enh1`) every dock plug logged either an answer + within ~80 ms from `28cc00000` (a cold-boot plug, after which `289c00000` took over the picture) or went straight + to `289c00000`. No `failed to validate DPTX target` line exists in the kernel journal of boots −1 to −7. This boot + (wip3) had no earlier dock plug; the three wip3 boots before it ran for under an hour each and none logged a dock. + +## Related + +`dcpext1` is `28cc00000` (the tunnel connector, no Type-C mux in the device tree); `dcpext0` is `289c00000` +(the built-in HDMI). An earlier, different failure of the same DCP is recorded in +[`fairydust/usb4/evidence/2026-10-16-dbgboot-dcp-silent-never-configures-link.md`](../../fairydust/usb4/evidence/2026-10-16-dbgboot-dcp-silent-never-configures-link.md) +(older kernel: firmware silent after ACTIVATE, never answering `set_hpd`). Not shown to be the same cause. + +## What is not shown + +- **Why `28cc00000` was chosen at 07:04:27.** The candidate scorer prefers the lowest CRTC index among available + pipelines (`dcp_fabric_tunnel_candidate()`), which would be `289c00000`. Both `dcp_fabric_available()` (owned, + fixed output busy, HDMI presence not settled) and the planner (`keep_order`, another port wanting that pipeline) can + exclude it. `289c00000` logged a disconnect at 07:04:23, four seconds earlier. No verbose logging was on, so the + reason is not in the journal. +- **Why the service went silent.** Candidates: long idle since boot (14 h) of an external DCP; the 07:04:23 power + event; a firmware state left by the previous trial boots. None is tested. A reboot is expected to clear it, since + a fresh `28cc00000` answered on every earlier boot — not verified on this boot. +- **Whether this repeats.** One occurrence. + +## Workaround for the running kernel + +Move the dock to another USB-C port. If the port stays dark on the same port after replug, that port is pinned until +reboot (finding 2). Reboot also clears it. + +## The draft patch + +`unified72/patches/0002-drm-apple-free-dp-tunnel-route-from-silent-dcpext.patch`, series revision 5, candidate +`7.2.11-elementary-aurora72-wip4`: + +- A DPTX call that times out marks that DCP's pipeline unresponsive for 300 s (cleared on the next connect that + gets an answer). New `dptx_holdoff` fields on `struct apple_dcp`; `unresponsive` on `struct dcp_fabric_pipeline`. +- `dcp_fabric_available()` is false for an unresponsive pipeline and `dcp_fabric_plan()` does not plan onto one, + unless a tunnel already holds it. With no other pipeline free the request returns `-EBUSY`; the Thunderbolt side + already treats that as "no display pipeline free; waiting for one" and retries every 2 s + (`apple_dpin_m1`, `capacity_retry`), so a retry lands on `289c00000` when it is free. +- `dcp_tb_release_locked()` completes a release whose firmware call timed out: it drops the DCP's connected view + (`dcp_dptx_abandon()`) and goes on to free the crossbar route, instead of keeping the route owned. + +### What it fixes and what it does not + +- Fixes: a port pinned to a dead pipeline until reboot (finding 2), and the next plug choosing the dead pipeline + again while it is held off. +- Does **not** move the dock to `289c00000` within the plug that already attached to the silent pipeline (the + 07:04 case): the tunnel is attached before the validate runs, and the Thunderbolt driver only re-requests + on a new tunnel event. The expected result there is a dark monitor, then a working one after one replug, + instead of a port dark until reboot. Closing that gap needs the DCP to ask the Thunderbolt side for a new request + (not designed here). +- Does not explain or prevent the silence itself. + +### Checked here + +- The patch applies (`git apply --check`) on the exact pinned files with 0001 applied. The six file blobs were read + from GitHub at `bd526b3c`; no archive was downloaded and no full tree was built. +- The pure routing change (`dcp_fabric_available()`, `dcp_fabric_tunnel_candidate()`, `dcp_fabric_plan()`) was + compiled from the real `dcp-fabric-core.c` against stub headers and run in userspace. The scenario passes, and + four checks fail when the availability change is removed. The same scenario is added as the KUnit case + `fabric_unresponsive_pipeline_test`; KUnit itself was not run. +- `dcp.c` and `dcp-fabric.c` edits were not compiled. The `aurora-enhancements` workflow builds `unified72` on this PR. + +### Acceptance before anyone arms it + +Native build and KUnit pass in CI; stage unarmed beside wip3 (owner decision); then on the J314S: dock plug on each port +from a fresh boot, a plug after hours idle, and a deliberate replug on the port that failed. Look for +`DPTX service not answering`, `no display pipeline free; waiting for one` and `a display pipeline came free`. Keep +`.20` as the default and the wip3 rollback in `unified72/BOOT-TRIAL.md`. + +## Side observation: audio blips on plug and unplug + +Each dock plug or unplug flips AC/battery; `mseries-power` then reapplies the CPU profile (07:12:20–23: power-saver +2208 MHz caps, then balanced 3036 MHz, three runs in 3 s) and the panel DCP power-cycles. The only logged glitch is one +`snd_pcm_avail after recover: Broken pipe` on `hw:AppleJ314,1p` at 07:04:23. The dock exposes no audio device to +PipeWire. Cause not established. diff --git a/mseries/aurora/test_candidate.py b/mseries/aurora/test_candidate.py index c55c768d5..7621eca97 100644 --- a/mseries/aurora/test_candidate.py +++ b/mseries/aurora/test_candidate.py @@ -1,9 +1,15 @@ #!/usr/bin/env python3 """Candidate admission checks: config resolution, input integrity and output isolation.""" +import hashlib +import io import json from pathlib import Path +import subprocess +import tarfile import tempfile +from types import SimpleNamespace import unittest +import urllib.error from unittest import mock import candidate @@ -41,6 +47,11 @@ def test_actual_config_is_updated_and_egpu_is_explicit(self): self.assertEqual(values["LOCALVERSION"], '""') egpu = candidate.configure(original, candidate.settings(data, "egpu")) self.assertEqual(candidate.config_values(egpu)["DRM_AMDGPU"], "m") + unified72_egpu = candidate.configure(original, candidate.settings(candidate.series("unified72-egpu"), "unified72-egpu")) + self.assertEqual(candidate.config_values(unified72_egpu)["DRM_AMDGPU"], "m") + self.assertEqual(candidate.config_values(unified72_egpu)["DRM_NOUVEAU"], "m") + self.assertEqual(candidate.series("unified72-egpu")["kernel_release"]["unified72-egpu"], + "7.2.11-elementary-aurora72-wip4-egpu") def test_kconfig_silently_disabling_rust_or_an_enhancement_is_rejected(self): data = candidate.series() @@ -98,6 +109,181 @@ def test_artifacts_cannot_be_archived_into_their_own_source(self): candidate.fresh(root / "source/artifacts", outside=root) self.assertFalse((root / "source/artifacts").exists()) + def test_pinned_source_download_retries_rate_limit_and_honors_retry_after(self): + url = "https://codeload.github.com/example/source.tar.gz" + limited = urllib.error.HTTPError(url, 429, "rate limited", {"Retry-After": "0"}, None) + with tempfile.TemporaryDirectory() as temporary: + destination = Path(temporary) / "source.tar.gz.part" + with mock.patch.object(candidate.urllib.request, "urlopen", + side_effect=[limited, io.BytesIO(b"archive")]) as urlopen, \ + mock.patch.object(candidate.time, "sleep") as sleep: + candidate.download_pinned_source(url, destination, attempts=2) + self.assertEqual(destination.read_bytes(), b"archive") + self.assertEqual(urlopen.call_count, 2) + sleep.assert_called_once_with(0.0) + limited.close() + + def test_source_retry_after_http_date_is_parsed(self): + error = urllib.error.HTTPError("https://example.test/source", 503, "unavailable", + {"Retry-After": "Thu, 01 Jan 1970 00:00:10 GMT"}, None) + with mock.patch.object(candidate.time, "time", return_value=0): + self.assertEqual(candidate.source_retry_delay(error, 0), 10) + error.close() + + def test_pinned_source_download_does_not_retry_permanent_http_errors(self): + url = "https://codeload.github.com/example/source.tar.gz" + missing = urllib.error.HTTPError(url, 404, "not found", {}, None) + with tempfile.TemporaryDirectory() as temporary: + destination = Path(temporary) / "source.tar.gz.part" + with mock.patch.object(candidate.urllib.request, "urlopen", side_effect=missing) as urlopen, \ + mock.patch.object(candidate.time, "sleep") as sleep: + with self.assertRaises(urllib.error.HTTPError): + candidate.download_pinned_source(url, destination) + urlopen.assert_called_once_with(url, timeout=120) + sleep.assert_not_called() + self.assertFalse(destination.exists()) + missing.close() + + def test_pinned_source_download_has_a_bounded_attempt_count(self): + url = "https://codeload.github.com/example/source.tar.gz" + failures = [urllib.error.HTTPError(url, 503, "unavailable", {}, None) for _ in range(4)] + with tempfile.TemporaryDirectory() as temporary: + destination = Path(temporary) / "source.tar.gz.part" + with mock.patch.object(candidate.urllib.request, "urlopen", side_effect=failures) as urlopen, \ + mock.patch.object(candidate.time, "sleep") as sleep: + with self.assertRaises(urllib.error.HTTPError): + candidate.download_pinned_source(url, destination) + self.assertEqual(urlopen.call_count, candidate.SOURCE_DOWNLOAD_ATTEMPTS) + self.assertEqual([call.args for call in sleep.call_args_list], [(2.0,), (4.0,), (8.0,)]) + self.assertFalse(destination.exists()) + for error in failures: + error.close() + + def test_pinned_source_uses_exact_git_tree_after_persistent_rate_limit(self): + url = "https://codeload.github.com/example/source.tar.gz" + limited = urllib.error.HTTPError(url, 429, "rate limited", {}, None) + source_pin = {"name": "source.tar.gz", "url": url, "sha256": "unused-codeload-hash", + "git_url": "https://github.com/example/source.git", + "commit": "a" * 40, "git_tree_sha1": "b" * 40, + "archive_root": "source-example"} + with tempfile.TemporaryDirectory() as temporary: + def write_git_archive(pin, destination): + self.assertEqual(pin, source_pin) + Path(destination).write_bytes(b"verified git archive") + + with mock.patch.object(candidate, "download_pinned_source", side_effect=limited), \ + mock.patch.object(candidate, "fetch_pinned_source_from_git", side_effect=write_git_archive) as fetch: + archive, cleanup = candidate.obtain_pinned_source(source_pin, temporary, offline=False) + self.assertEqual(archive.read_bytes(), b"verified git archive") + self.assertEqual(cleanup, archive) + fetch.assert_called_once() + cleanup.unlink() + limited.close() + + def test_pinned_source_git_fallback_rejects_a_different_tree(self): + source_pin = {"git_url": "https://github.com/example/source.git", "commit": "a" * 40, + "git_tree_sha1": "b" * 40, "archive_root": "source-example"} + with tempfile.TemporaryDirectory() as temporary: + destination = Path(temporary) / "source.tar" + with mock.patch.object(candidate, "run") as run, \ + mock.patch.object(candidate.subprocess, "run", side_effect=[ + SimpleNamespace(stdout="a" * 40 + "\n"), + SimpleNamespace(stdout="c" * 40 + "\n") + ]): + with self.assertRaisesRegex(ValueError, "tree checksum mismatch"): + candidate.fetch_pinned_source_from_git(source_pin, destination) + self.assertFalse(destination.exists()) + self.assertFalse(any("archive" in call.args for call in run.call_args_list)) + + def test_pinned_source_git_fallback_archives_the_verified_commit(self): + commit = "a" * 40 + tree = "b" * 40 + source_pin = {"git_url": "https://github.com/example/source.git", "commit": commit, + "git_tree_sha1": tree, "archive_root": "source-example"} + with tempfile.TemporaryDirectory() as temporary: + destination = Path(temporary) / "source.tar" + + def fake_git(*args, **kwargs): + if "archive" in args: + output = next(arg.split("=", 1)[1] for arg in args if str(arg).startswith("--output=")) + Path(output).write_bytes(b"verified git archive") + + with mock.patch.object(candidate, "run", side_effect=fake_git) as run, \ + mock.patch.object(candidate.subprocess, "run", side_effect=[ + SimpleNamespace(stdout=commit + "\n"), + SimpleNamespace(stdout=tree + "\n") + ]): + candidate.fetch_pinned_source_from_git(source_pin, destination) + self.assertEqual(destination.read_bytes(), b"verified git archive") + self.assertTrue(any("fetch" in call.args and commit in call.args for call in run.call_args_list)) + archive_call = next(call.args for call in run.call_args_list if "archive" in call.args) + self.assertIn("--prefix=source-example/", archive_call) + self.assertEqual(archive_call[-1], "FETCH_HEAD") + + def test_pinned_source_git_fallback_fetches_and_archives_a_local_pinned_commit(self): + with tempfile.TemporaryDirectory() as temporary: + origin = Path(temporary) / "origin" + origin.mkdir() + subprocess.run(["git", "init", "--quiet", "--initial-branch=main", origin], check=True) + subprocess.run(["git", "-C", origin, "config", "user.name", "Aurora test"], check=True) + subprocess.run(["git", "-C", origin, "config", "user.email", "aurora-test@example.invalid"], check=True) + (origin / "Makefile").write_text("VERSION = 7\nPATCHLEVEL = 2\nSUBLEVEL = 11\n") + subprocess.run(["git", "-C", origin, "add", "Makefile"], check=True) + subprocess.run(["git", "-C", origin, "commit", "--quiet", "-m", "source fixture"], check=True) + commit = subprocess.check_output(["git", "-C", origin, "rev-parse", "HEAD"], text=True).strip() + tree = subprocess.check_output(["git", "-C", origin, "rev-parse", "HEAD^{tree}"], text=True).strip() + source_pin = {"git_url": str(origin), "commit": commit, "git_tree_sha1": tree, + "archive_root": "linux-aurora-fixture"} + destination = Path(temporary) / "source.tar" + candidate.fetch_pinned_source_from_git(source_pin, destination) + with tarfile.open(destination, "r:*") as archive: + member = archive.getmember("linux-aurora-fixture/Makefile") + self.assertEqual([entry.name for entry in archive.getmembers() if entry.isfile()], + ["linux-aurora-fixture/Makefile"]) + self.assertEqual(archive.extractfile(member).read(), + b"VERSION = 7\nPATCHLEVEL = 2\nSUBLEVEL = 11\n") + + def test_pinned_source_does_not_use_git_fallback_for_permanent_http_errors(self): + url = "https://codeload.github.com/example/source.tar.gz" + missing = urllib.error.HTTPError(url, 404, "not found", {}, None) + source_pin = {"name": "source.tar.gz", "url": url, "sha256": "unused-codeload-hash", + "git_url": "https://github.com/example/source.git", "commit": "a" * 40, + "git_tree_sha1": "b" * 40, "archive_root": "source-example"} + with tempfile.TemporaryDirectory() as temporary: + with mock.patch.object(candidate, "download_pinned_source", side_effect=missing), \ + mock.patch.object(candidate, "fetch_pinned_source_from_git") as fetch: + with self.assertRaises(urllib.error.HTTPError): + candidate.obtain_pinned_source(source_pin, temporary, offline=False) + fetch.assert_not_called() + missing.close() + + def test_pinned_source_does_not_fall_back_after_archive_checksum_mismatch(self): + archive_bytes = b"unexpected archive" + source_pin = {"name": "source.tar.gz", "url": "https://codeload.github.com/example/source.tar.gz", + "sha256": hashlib.sha256(b"expected archive").hexdigest(), + "git_url": "https://github.com/example/source.git", "commit": "a" * 40, + "git_tree_sha1": "b" * 40, "archive_root": "source-example"} + with tempfile.TemporaryDirectory() as temporary: + def write_bad_archive(_url, destination): + Path(destination).write_bytes(archive_bytes) + + with mock.patch.object(candidate, "download_pinned_source", side_effect=write_bad_archive), \ + mock.patch.object(candidate, "fetch_pinned_source_from_git") as fetch: + with self.assertRaisesRegex(ValueError, "unified source checksum mismatch"): + candidate.obtain_pinned_source(source_pin, temporary, offline=False) + fetch.assert_not_called() + self.assertFalse((Path(temporary) / "source.tar.gz").exists()) + + def test_pinned_source_cache_requires_the_original_archive_checksum(self): + archive_bytes = b"valid pinned archive" + source_pin = {"name": "source.tar.gz", "sha256": hashlib.sha256(archive_bytes).hexdigest()} + with tempfile.TemporaryDirectory() as temporary: + cached = Path(temporary) / source_pin["name"] + cached.write_bytes(archive_bytes) + archive, cleanup = candidate.obtain_pinned_source(source_pin, temporary, offline=True) + self.assertEqual(archive, cached) + self.assertIsNone(cleanup) + if __name__ == "__main__": unittest.main() diff --git a/mseries/aurora/test_qualification.py b/mseries/aurora/test_qualification.py index 8eb3878e0..f01e3177e 100644 --- a/mseries/aurora/test_qualification.py +++ b/mseries/aurora/test_qualification.py @@ -224,20 +224,29 @@ def test_unified72_snapshot_has_separate_identity_and_no_moving_branch_url(self) self.assertRegex(data["source"]["sha256"], r"^[a-f0-9]{64}$") self.assertTrue(data["kernel_release"]["unified72"].startswith("7.2.11-")) lane = candidate.HERE / "unified72" - # wip3 carries exactly the reviewed #157 display patch on the #158 source. + # wip4 carries the display/DPTX series followed by the six Aurora20 ports. self.assertEqual([patch["file"] for patch in data["patches"]], - ["0001-drm-apple-srgb-external-display-colour.patch"]) + ["0001-drm-apple-srgb-external-display-colour.patch", + "0002-drm-apple-free-dp-tunnel-route-from-silent-dcpext.patch", + "0003-udmabuf.patch", "0004-m3-thermal-fallback.patch", + "0005-j613-camera-147.patch", "0006-t8122-camera-2662.patch", + "0007-macsmc-optional-properties.patch", "0008-egpu-config.patch"]) + self.assertEqual([entry["profile"] for entry in data["patches"]], + ["candidate"] * 7 + ["egpu"]) + for entry in data["patches"]: + self.assertEqual(candidate.sha256(lane / "patches" / entry["file"]), entry["sha256"]) patch = data["patches"][0] - self.assertEqual(patch["profile"], "candidate") - self.assertEqual(candidate.sha256(lane / "patches" / patch["file"]), patch["sha256"]) + self.assertIsNone(data["patches"][1]["upstream"]) self.assertEqual(data["superseded_patches"][0]["head"], "4c56f9cd3033e5f65ef9c61bc7b396d50bce23f7") retired = data["superseded_patches"][0] self.assertEqual(candidate.sha256(lane / "patches" / retired["file"]), retired["sha256"]) self.assertEqual(data["kernel_release"]["unified72"], - "7.2.11-elementary-aurora72-wip3") - self.assertEqual(data["debian_package"], "linux-image-elementary-aurora72-wip3") + "7.2.11-elementary-aurora72-wip4") + self.assertEqual(data["debian_package"], "linux-image-elementary-aurora72-wip4") + # The installed wip3 and wip2 packages must stay distinct from this one. + self.assertNotEqual(data["debian_package"], "linux-image-elementary-aurora72-wip3") self.assertNotEqual(data["debian_package"], "linux-image-elementary-aurora72-wip2") receipt = json.loads((lane / data["review_receipt"]).read_text()) self.assertEqual(receipt["source"], data["source"]["commit"]) @@ -245,8 +254,11 @@ def test_unified72_snapshot_has_separate_identity_and_no_moving_branch_url(self) self.assertEqual(receipt["archive_verification"]["archive_root"], data["source"]["archive_root"]) self.assertEqual(receipt["patches"][0]["head"], patch["head"]) + self.assertEqual([entry["file"] for entry in receipt["patches"]], + [entry["file"] for entry in data["patches"][:7]]) self.assertIn("not_rerun", receipt) self.assertEqual(candidate.settings(data, "unified72")["DRM_AMDGPU"], "n") + self.assertEqual(candidate.settings(data, "unified72-egpu")["DRM_AMDGPU"], "m") if __name__ == "__main__": diff --git a/mseries/aurora/unified72/AURORA20-PORT-AUDIT-2026-10-22.md b/mseries/aurora/unified72/AURORA20-PORT-AUDIT-2026-10-22.md new file mode 100644 index 000000000..de8a14e9a --- /dev/null +++ b/mseries/aurora/unified72/AURORA20-PORT-AUDIT-2026-10-22.md @@ -0,0 +1,74 @@ +# Aurora20 → wip4 port audit for the owner’s machine — 2026-10-22 + +## Owner target and result + +This audit is relative to the owner’s 14-inch M1 Pro MacBook (`J314S`) running elementary OS on Asahi, with a Dell WD22TB4 and HDMI display. The current trial is wip3; Aurora `.20` remains the persistent default. This change prepares a separate wip4 series and does not install, stage, arm or boot it. + +The owner-facing kernel work is the 7.2.11 DCP/display series: upstream #157 adds external-display sRGB handling, and the local wip4 patch addresses the observed `dcpext1` DPTX timeout and pinned tunnel route. The six Aurora20 ports are included because the owner requested them, but most target other hardware or optional setups. They do not make the J314S camera, M3 thermal behavior or eGPU support qualified. + +## Six requested ports + +All six patches were applied in manifest order to a clean extraction of the exact wip4 source commit (`bd526b3c11ccf8e91d6240261beb3219d8f17f03`, tree `a305f231d9137847c7f0ececca98e214cc30e792`). Every `git apply --check` passed, including the eGPU patch after the udmabuf config patch. + +| wip4 patch | Upstream source and status checked 2026-10-22 | Port and owner relevance | +|---|---|---| +| `0003-udmabuf.patch` | [#67 first commit](https://github.com/omacom/linux-aurora/commit/6984b8c07e84b0cf528243db1838dade971ff513); #67 remains an open draft PR | Config fragment plus checked full build config. Generic facility; usefulness depends on applications and suitable permissions/alignment. No local-AI performance claim. | +| `0004-m3-thermal-fallback.patch` | [#135](https://github.com/omacom/linux-aurora/pull/135), open | Adapted into the 7.2.11 `m3_thermal_policy.rs` helper and its host controls. **Dormant:** #158 has a compile-only M3 backend that refuses runtime startup, so no thermal control is activated. M3/T8122-only and not relevant to J314S. | +| `0005-j613-camera-147.patch` | [#134](https://github.com/omacom/linux-aurora/pull/134), open | Unmodified patch; scoped to J613/T8122 camera firmware compatibility. It does not target J314S. | +| `0006-t8122-camera-2662.patch` | [#119](https://github.com/omacom/linux-aurora/pull/119), open | Unmodified patch; requires the matching m1n1 ISP-heap support and device firmware. Not qualified on J314S. | +| `0007-macsmc-optional-properties.patch` | [upstream commit](https://github.com/omacom/linux-aurora/commit/4676c48ecf1b1acaba7c442d33fe9aae0f037e77) | Optional SMC gauge discovery. It should only change reporting when a property is missing or unreadable; prior hardware evidence is J700, and J314S telemetry remains unqualified. | +| `0008-egpu-config.patch` | [#67 second commit](https://github.com/omacom/linux-aurora/commit/d10d360a96f406f3b953eceb6e44e7be3f4c7c24); #67 remains an open draft PR | Only `--profile unified72-egpu` enables AMDGPU/Nouveau modules. The normal wip4 build keeps both off. No card, display output, BAR or compute qualification. | + +GitHub state was read directly on 2026-10-22: #158 is still open at the pinned source head, #157 is still open at `9d3aeb24cb864d5f99a7172e9004884bf3c1a9a0`, and #135, #134, #119 and draft #67 are still open. The local pins are deliberate snapshots; a later upstream merge or head change does not update wip4 automatically. + +## Local hardware fit and gates + +- **Directly relevant:** wip4’s DCP routing patch targets the reported WD22TB4 HDMI failure. It avoids a silent DCP for 300 seconds after timeout and treats timed-out release as complete. That latter assumption is the main code risk; the observed device timed out repeatedly, but a slow response is not ruled out. A tunnel already assigned during the first plug is not moved by this patch in that same plug. +- **Potentially generic:** udmabuf/system heap support and optional SMC gauge discovery. These add no claimed performance or battery-life improvement. +- **Other hardware:** M3 Air thermal and J613/T8122 camera support are not J314S features. The thermal policy is present but inactive while M3 startup is refused; the camera patches remain firmware-scoped and require their stated companion support. +- **Optional experiment:** eGPU modules are isolated to a separately named profile/package. It is not enabled in the owner’s normal wip4 profile. +- **Passed in CI:** ARM64 candidate, normal wip4 and opt-in eGPU Image/modules/DTB builds and package inspection ([run 39854228647](https://github.com/techmore/ElementaryOS_MSeries/actions/runs/39854228647)). **Still open:** DCP KUnit, an attended wip4 boot, WD22TB4 HDMI retry/recovery, camera/SMC hardware checks on matching devices, eGPU hardware checks, suspend/recovery and 64-fix semantic parity. + +The matching DT/m1n1, initramfs, boot entry and rollback have not been reviewed or staged for this revision. The existing wip3 trial and `.20` default are untouched. + +## Upstream display/Type-C scan before J314S testing — 2026-10-26 + +The upstream `integration/aurora` head is 163 commits ahead of pinned #158, so wip4 stays on its immutable +7.2.11 base rather than moving wholesale to a changing branch. #158 has since merged at the same pinned commit; +#157 (the external-display color patch already carried as `0001`) remains open. + +Reviewed [#186](https://github.com/omacom/linux-aurora/pull/186) and [#163](https://github.com/omacom/linux-aurora/pull/163). +Both remain open and `BLOCKED` as of this scan. #186 is a three-file DCP-fabric/TIPD change for direct DP-alt ports +that reserve display pipelines without HPD, including takeover when another direct port asserts HPD. Its author reports +a 7.2.10 J314S multi-display setup, and reports that a handover can leave DPTX timing out until reboot. #163 adjusts +TIPD's `-ENOSPC` handling so docks keep their USB path when a display pipeline is occupied; its hardware result is on +an M2 Air/T8112. Neither change directly addresses this J314S WD22TB4 tunneled-display timeout. #186's DCP changes +and wip4's local timeout/route-release patch touch the same subsystem, so combining them before a focused rebase and +interaction review would be unsafe. #163 is coupled to #186's standardized `-ENOSPC` semantics and lacks matching +J314S coverage. **Decision: do not add either open PR to this deploy candidate yet.** Revisit if they merge, if the +WD22TB4 failure evidence shows idle direct-port pipeline reservation is causal, or if an isolated source/KUnit review +shows a minimal safe subset. The local wip4 DCP patch remains required for the observed `-ETIMEDOUT` route wedge. + +Other scanned display work: [#154](https://github.com/omacom/linux-aurora/pull/154) targets simultaneous DP tunnels +for a tiled 5K Studio Display and is outside this single 1080p HDMI target. No additional merged Aurora release +supersedes the pinned 7.2.11 base as of this scan. + +## Deployment readiness + +Wip4's CI package is now downloaded and audited from run 39944207967: GitHub's artifact digest and all four +`SHA256SUMS` entries match; 17 provenance-recorded modified source files match; package identity is +`linux-image-elementary-aurora72-wip4_7.2.11+elementary.aurora72.wip4-1_arm64.deb`, with 1,876 modules, 115 Apple DTBs +and the J314S DTB present. The package has no boot hooks. An offline J314S trial bundle is staged privately at +`/home/sdolbec/aurora-wip4-trial-20261026-v2/`: candidate vmlinuz/initrd, proposed GRUB config, byte-exact +`boot.bin.rollback`, package, matching source archive and provenance. Candidate initrd SHA-256 is +`07daaa0ef934b4a9e7a905e9d7d6f9bffe2a23ea59316a6f7d22602defe6349a`; rollback SHA-256 matches current shared +`boot.bin` (`9c9c2d01c3bdb2784daf99cecd6f0e2327eb8f148ea43c8e522e5bae09a14d5f`). GRUB syntax and the original-unlock/ +module-package audit passed; the proposal retains `.20` as persistent default. Nothing was installed, copied into `/boot`, +added to the live GRUB config, armed or booted. This keeps the existing shared DTB/m1n1 payload, which is already the +current chain, rather than swapping it for a new payload. + +Deployment is **staged but not yet approved/qualified**: review the private bundle and rollback accessibility, then +perform an attended owner-approved trial. The source archive's base tree was not independently reconstructed from the +pinned codeload archive, and fallback boot after a wip4 trial is unqualified. After boot, qualify one-shot dock recovery +and repeated plug/unplug using the monitor-restore watcher fix; do not infer permanent recovery from the current +front-left picture. diff --git a/mseries/aurora/unified72/README.md b/mseries/aurora/unified72/README.md index 090283112..e090d5ae6 100644 --- a/mseries/aurora/unified72/README.md +++ b/mseries/aurora/unified72/README.md @@ -1,4 +1,34 @@ -# Unified Aurora 7.2.10 build candidate +# Unified Aurora 7.2.11 build candidate + +## wip4 candidate — upstream scan and deployment preparation, October 26, 2026 + +Before any further dock cable test, the refreshed scan reviewed Aurora #186, #163, #9, #154, #157, #170 and issue #130. No new narrow fix is ready to add: #186 overlaps the local DCP-fabric timeout patch; #163 preserves dock USB and conflicts with #186; #9 is a broad older tunnel implementation already represented in the pinned source; #154 concerns simultaneous tunnels; #157 is already included; #170 and #130 have different triggers. Keep this WIP4 pin unchanged. See the [2026-10-26 source scan](upstream-review-2026-10-26.md). + +**Offline trial preparation is complete; deployment and qualification remain open.** Run 39944207967's exact WIP4 +package/source/provenance are checksum-audited and staged with the candidate vmlinuz/initrd, proposed GRUB config and +byte-exact rollback under `/home/sdolbec/aurora-wip4-trial-20261026-v2/`. The preparation receipt confirms original +root-unlock/module dependencies and keeps `.20` as persistent default. Nothing was installed, added to live GRUB, +armed or booted; the existing shared 7.1 DTB/m1n1 payload remains in place. Review rollback accessibility and fallback +compatibility before an attended trial. The monitor currently works on front-left; that is a workaround result, not +proof of persistent plug/unplug recovery. + +## wip4 candidate — October 22, 2026 (built, not booted) + +**Revision 6 pins `7.2.11-elementary-aurora72-wip4`:** unmerged upstream #158 plus #157, the local J314S dock +recovery patch, and all six requested Aurora20 enhancements. The six ports apply in order to the exact pinned source. +The normal wip4 profile keeps AMD/Nouveau disabled; `unified72-egpu` builds a separately named, opt-in package. +The M3 thermal fallback is carried as dormant policy code because this source's M3 backend still refuses runtime +startup. Camera changes stay limited by their firmware/m1n1 requirements. Owner-machine applicability and current +upstream states are in [the J314S audit](AURORA20-PORT-AUDIT-2026-10-22.md). + +The local DCP patch addresses the first wip3 dock plug of a boot (2026-10-22), where `dcpext1` (`28cc00000`) never +answered the DisplayPort validate call and its port stayed pinned until reboot. A DCP whose DPTX call times out is +passed over for 300 s, and a timed-out release is completed instead of kept owned. It does not move a tunnel already +attached to the silent pipeline during that same plug. Evidence: [wip3 DPTX stall report](../hardware-tests/2026-10-22-j314s-wip3-dcpext1-dptx-wedge.md). +The [ARM64 workflow](https://github.com/techmore/ElementaryOS_MSeries/actions/runs/39854228647) passed the candidate, +normal wip4 and wip4-eGPU kernel/module/DTB builds plus package inspection. The Python admission suite passed 83/83; +production host controls and the MacSMC ASan/UBSan helper passed for both wip4 profiles. DCP KUnit and hardware boot +remain open. wip3 remains installed and running; nothing is staged or armed for wip4. See [review receipt](review-wip4-2026-10-22.json). ## wip3 candidate — October 21, 2026 (build-only, not booted) @@ -127,14 +157,16 @@ python3 mseries/aurora/candidate.py prepare --profile unified72 \ python3 mseries/aurora/candidate.py check --prepared /absolute/work/unified72 python3 mseries/aurora/candidate.py build --prepared /absolute/work/unified72 \ --output /absolute/work/unified72-artifacts --jobs 4 +# Optional, unqualified AMD/Nouveau module profile; separate package and kernel release: +python3 mseries/aurora/candidate.py prepare --profile unified72-egpu \ + --cache /absolute/work/cache --output /absolute/work/unified72-egpu ``` The builder uses the checksum-pinned `.20` **full recipe config** as its seed, resolves it with the pinned 7.2 source and enforces Apple/Rust/16K/USB4/memory requirements. It is not the contributor's Fedora config. eGPU drivers remain -disabled in this profile. The separate `.20` M3 camera/thermal/SMC series is not -silently layered onto this source. Preparation, build and package inspection -fail on pin/config/identity errors; none installs a package. +disabled in `unified72` and enabled only in `unified72-egpu`. Preparation, build +and package inspection fail on pin/config/identity errors; none installs a package. ## Hardware and compatibility gates diff --git a/mseries/aurora/unified72/boot-preflight-wip4-2026-10-26/preparation.json b/mseries/aurora/unified72/boot-preflight-wip4-2026-10-26/preparation.json new file mode 100644 index 000000000..79d2eb697 --- /dev/null +++ b/mseries/aurora/unified72/boot-preflight-wip4-2026-10-26/preparation.json @@ -0,0 +1,127 @@ +{ + "schema": 1, + "status": "prepared offline and original-unlock/module-package audit passed; no hardware boot qualification", + "baseline_sha256": "06a885396f5613154b2fbb6774744efde95a9d25512698d297b3f14da0d4f3aa", + "candidate_sha256": "07daaa0ef934b4a9e7a905e9d7d6f9bffe2a23ea59316a6f7d22602defe6349a", + "candidate_release": "7.2.11-elementary-aurora72-wip4", + "verified_module_count": 91, + "early_prefix_unchanged": true, + "nonmodule_entries_unchanged": true, + "module_bytes_match_candidate_tree": true, + "dependency_files_present": true, + "kind": "offline-j314s-wip4-boot-preparation", + "package_sha256": "7811064c1e5987f969b2f2c72ff06c44fea25d429e286917f844e457bcc7d8d9", + "candidate_image_sha256": "25e6f772200147cd843ef8aa46ffc4a44a14f5e123a41cb28ebe5e10aad0a3bb", + "resolved_config_sha256": "01bec2b49d984b1f74b7fbd254aed02e97eb0ce47ecc46fd463ce02727796ece", + "root_cipher": "aes-xts-plain64", + "original_baseline_sha256": "06a885396f5613154b2fbb6774744efde95a9d25512698d297b3f14da0d4f3aa", + "explicit_module_transitions": { + "kernel/crypto/fcrypt.ko": "Absent from this candidate; not needed by the observed AES-XTS LUKS2 root.", + "kernel/crypto/pcbc.ko": "Absent from this candidate; not needed by the observed AES-XTS LUKS2 root.", + "kernel/lib/raid6/raid6_pq.ko": "Relocated to kernel/lib/raid/raid6/raid6_pq.ko; retained through the new Btrfs dependency closure." + }, + "package_module_bytes_verified": true, + "module_sha256": { + "usr/lib/modules/7.2.11-elementary-aurora72-wip4/kernel/crypto/842.ko": "14c1987c3ceedc23d3baa6f59053f5af4800e9c486a04191549d579563d27b3d", + "usr/lib/modules/7.2.11-elementary-aurora72-wip4/kernel/crypto/adiantum.ko": "96a761b8312570b22a570c7bf1ca6e975986dbe741a4f1219e1230cbef7eda6c", + "usr/lib/modules/7.2.11-elementary-aurora72-wip4/kernel/crypto/aegis128.ko": "d514f4ff4b26f6c085f38ce132aadbcc087aff6e50ba58d0e79b63d91837dc2f", + "usr/lib/modules/7.2.11-elementary-aurora72-wip4/kernel/crypto/anubis.ko": "35430fa88e3f4d7a9f31f4f3c8eebcf3713f17c7b8bcea23056c19b6ffb5517f", + "usr/lib/modules/7.2.11-elementary-aurora72-wip4/kernel/crypto/arc4.ko": "338aa07b8eec6a5d3eb377befbe54d7fb79bca52617961d35c2202938ddeac8e", + "usr/lib/modules/7.2.11-elementary-aurora72-wip4/kernel/crypto/aria_generic.ko": "fa4e8dbdf7487314b87fb5bb377d31fc616982d1498414dde1bfe43c7d8ddfed", + "usr/lib/modules/7.2.11-elementary-aurora72-wip4/kernel/crypto/async_tx/async_memcpy.ko": "3ccc2b58a5609b408abef5615f6c8c6e5152b802443e8bd83ebab52424639e56", + "usr/lib/modules/7.2.11-elementary-aurora72-wip4/kernel/crypto/async_tx/async_pq.ko": "f72f0a1ea796f0f8eda55eb908945f0aaca06fa48213d8d1f869ffe81bede850", + "usr/lib/modules/7.2.11-elementary-aurora72-wip4/kernel/crypto/async_tx/async_raid6_recov.ko": "213f1c96e1df291b77da2b880908750eed594cb64423edc523062d2700b539d7", + "usr/lib/modules/7.2.11-elementary-aurora72-wip4/kernel/crypto/async_tx/async_tx.ko": "8c9a25554595fc52e6be07eff8aca32193b7c6247aad5c0ad6ddc7888120fd5a", + "usr/lib/modules/7.2.11-elementary-aurora72-wip4/kernel/crypto/async_tx/async_xor.ko": "e87faa3430a4ce353b2a6aabff3b133da36cc3813d42963f94346ad3a1482f50", + "usr/lib/modules/7.2.11-elementary-aurora72-wip4/kernel/crypto/authenc.ko": "91e235e379eab87d914e632d63d9db10b22f377c0e64fd147bdb3f1428752fa4", + "usr/lib/modules/7.2.11-elementary-aurora72-wip4/kernel/crypto/authencesn.ko": "ae0df1a7ff5b05db4fbc5c73c05b22808ba6c8dbe3b21e307b8e6e14087fd6fc", + "usr/lib/modules/7.2.11-elementary-aurora72-wip4/kernel/crypto/blowfish_common.ko": "a6951746ab95eb29ccd33c1ed27f7787f228627545e5dd114e4d1d5a4237cb97", + "usr/lib/modules/7.2.11-elementary-aurora72-wip4/kernel/crypto/blowfish_generic.ko": "7927306fa13e72ffc344f9f4428adec908cb4594b456e516192a3f8ec9298a05", + "usr/lib/modules/7.2.11-elementary-aurora72-wip4/kernel/crypto/camellia_generic.ko": "b7139b6eb97757f1fc677b0140ce4b2f2281ea89a0fd4129af8f17ecb775b870", + "usr/lib/modules/7.2.11-elementary-aurora72-wip4/kernel/crypto/cast5_generic.ko": "d1ce40862adf18e8163f19a09749e52386f5abe7cfe54dafed51de50e6504067", + "usr/lib/modules/7.2.11-elementary-aurora72-wip4/kernel/crypto/cast6_generic.ko": "3fc35ef4e2b97fb9515c77e7489a607eda20b1bf65c1c5381758051136045b58", + "usr/lib/modules/7.2.11-elementary-aurora72-wip4/kernel/crypto/cast_common.ko": "db0ace127d28afa7c6c602c07e210d59c19a4f21ee0f5cf1602888f17a7a588b", + "usr/lib/modules/7.2.11-elementary-aurora72-wip4/kernel/crypto/ccm.ko": "6af75f269c742644b70fef3f1b202c55aff1450529d431a6d04a9cfa64e8ce17", + "usr/lib/modules/7.2.11-elementary-aurora72-wip4/kernel/crypto/chacha20poly1305.ko": "6b8e779048b8714eab0c8b4e701ae84e59a1125c47598b4eeaeb5f9ad6d7ac4a", + "usr/lib/modules/7.2.11-elementary-aurora72-wip4/kernel/crypto/cmac.ko": "ddfd16005ff98d2fc7578932e07e92d38f3dbf72687db87d8c18ad93dc9a65fe", + "usr/lib/modules/7.2.11-elementary-aurora72-wip4/kernel/crypto/crypto_engine.ko": "4d9ce1f26a2b108ce561f0679cb556dd8d5901a7e7616c5cca61427fc35902f8", + "usr/lib/modules/7.2.11-elementary-aurora72-wip4/kernel/crypto/crypto_user.ko": "28720ffb36b22c3cf81194b84c89a97fa2c43270048d7e047183de520b11c742", + "usr/lib/modules/7.2.11-elementary-aurora72-wip4/kernel/crypto/des_generic.ko": "377937f871c30c478b61f820ba7952668a4591d9294a72f1413e6a1f2e546592", + "usr/lib/modules/7.2.11-elementary-aurora72-wip4/kernel/crypto/ecc.ko": "01a8d59077ea9e87c5b52600ea3d22fc81f3389578d0d10ffd8a356b137b3afb", + "usr/lib/modules/7.2.11-elementary-aurora72-wip4/kernel/crypto/ecdh_generic.ko": "11a7286ee68d9941934eef0da96675d401764503a29b8df9554b74b3f7ad6992", + "usr/lib/modules/7.2.11-elementary-aurora72-wip4/kernel/crypto/echainiv.ko": "7b16a62f0418c3497f07f72e24fa45d67b9bda2f1aa384bb82f580d03f156204", + "usr/lib/modules/7.2.11-elementary-aurora72-wip4/kernel/crypto/essiv.ko": "cbe2f988e387c9ad5c735404d48956f053c79eac372a24dbed593fa41ee1de01", + "usr/lib/modules/7.2.11-elementary-aurora72-wip4/kernel/crypto/khazad.ko": "37269341fc9a44465733c752d5823974415fbc68053f1221aa918392f2396b56", + "usr/lib/modules/7.2.11-elementary-aurora72-wip4/kernel/crypto/krb5/krb5.ko": "1a5ea9433c8e9e546a5925d39d7a13053243bbbd65d049a2e93f25aabfcdd60b", + "usr/lib/modules/7.2.11-elementary-aurora72-wip4/kernel/crypto/krb5enc.ko": "1352fb23f781dba1f9c4b7c3c9db9b8be243fb79fc186096ce4b92d2dca624c9", + "usr/lib/modules/7.2.11-elementary-aurora72-wip4/kernel/crypto/lrw.ko": "7af52de7742648692b96b18f45cc8d84de7a336286c2feaee3db7d4a2793bcfd", + "usr/lib/modules/7.2.11-elementary-aurora72-wip4/kernel/crypto/lz4.ko": "276124093fa5b87bbd075893108391c652c4a4ce9a8bfc7866ddbfa97b2ad34a", + "usr/lib/modules/7.2.11-elementary-aurora72-wip4/kernel/crypto/lz4hc.ko": "3d2939d2ea4489944c06053356f202eb939575a4d2a3a0249916b140656b72a5", + "usr/lib/modules/7.2.11-elementary-aurora72-wip4/kernel/crypto/md4.ko": "bdb00867b4dd50ee87b3c62ca6de15e1db1523797710b5245e40cefa638adbbe", + "usr/lib/modules/7.2.11-elementary-aurora72-wip4/kernel/crypto/pcrypt.ko": "af251b925d1f23049874aacedf458daf47cf86dce433e7ce092f57c02edeaeee", + "usr/lib/modules/7.2.11-elementary-aurora72-wip4/kernel/crypto/rmd160.ko": "3a900947c1227913c16d2ffb64344cfc88b15ee0c1a50ddcfb5a49afa7d9f092", + "usr/lib/modules/7.2.11-elementary-aurora72-wip4/kernel/crypto/seed.ko": "029fc537706e1ea86f42b2a105f19c587dee09d42d1895e0dc7ed36e46b44183", + "usr/lib/modules/7.2.11-elementary-aurora72-wip4/kernel/crypto/serpent_generic.ko": "1240c4bdcd05123b5c9247f14d83c5c34b161085874a62d142e0358e93023d77", + "usr/lib/modules/7.2.11-elementary-aurora72-wip4/kernel/crypto/sm3.ko": "99c7f6e067c3ee7be719296e07e947e11c1edfb20d16d9998ce113c318724370", + "usr/lib/modules/7.2.11-elementary-aurora72-wip4/kernel/crypto/sm4_generic.ko": "9a30622e6850a42b29113c31a3367f5afa44fafb14c1f50918c4d608c84a6032", + "usr/lib/modules/7.2.11-elementary-aurora72-wip4/kernel/crypto/tea.ko": "f8202e00b45553573bcab39c7aa197264b3af74d2d47bc1c643a1d8e01aa2eec", + "usr/lib/modules/7.2.11-elementary-aurora72-wip4/kernel/crypto/twofish_common.ko": "1332c31d6e0a23ee1cedb70dd046ffa81376a908567bf043813a694706e67c9a", + "usr/lib/modules/7.2.11-elementary-aurora72-wip4/kernel/crypto/twofish_generic.ko": "f500b8169649c6dd5fc1fac9ef7b2823b25c0f9bf450b6e741056dfe06baf609", + "usr/lib/modules/7.2.11-elementary-aurora72-wip4/kernel/crypto/wp512.ko": "24abf3b20b41c72b7c36160bc780b1f5428c428ffcb305e32c060e123110db7e", + "usr/lib/modules/7.2.11-elementary-aurora72-wip4/kernel/crypto/xcbc.ko": "010dbd257a870371c009570925aea8e34e7cf622d6d680cf33e09c1dd8ddc251", + "usr/lib/modules/7.2.11-elementary-aurora72-wip4/kernel/crypto/zstd.ko": "a4e2d2227961682772e1f0eabc08c216f0692d75da1699fd639a22a1c2459577", + "usr/lib/modules/7.2.11-elementary-aurora72-wip4/kernel/drivers/crypto/virtio/virtio_crypto.ko": "35026544e6ca323176c7505b6870508480941acbdf980e1e52a9bb4341879950", + "usr/lib/modules/7.2.11-elementary-aurora72-wip4/kernel/drivers/gpu/drm/apple/appledrm.ko": "756678ee046cfc91fd41a8b7ca694a18b65b07dca2fcfb1c5abbd82c000ec58b", + "usr/lib/modules/7.2.11-elementary-aurora72-wip4/kernel/drivers/gpu/drm/apple/dcp-fabric-core.ko": "126c89f7e3221475ff8249c211562919b35430387507a87dd18c5042438d7def", + "usr/lib/modules/7.2.11-elementary-aurora72-wip4/kernel/drivers/gpu/drm/drm_dma_helper.ko": "675069977816629e622248beb841852ef10173486a41353100c788f68384d9ff", + "usr/lib/modules/7.2.11-elementary-aurora72-wip4/kernel/drivers/hid/dockchannel-hid/dockchannel-hid.ko": "23c21e398605017d1b8e62791e7994ab261f7bb3afa763fc80b94114628ff8d6", + "usr/lib/modules/7.2.11-elementary-aurora72-wip4/kernel/drivers/hid/hid-apple-mtp-haptic.ko": "9ccadced359ffab86e452e11c30f10c689e4e86da253b123222cacfe718b9ff9", + "usr/lib/modules/7.2.11-elementary-aurora72-wip4/kernel/drivers/hid/hid-apple.ko": "972ca4b67002e5c59a13e0439676b77f2830f0084f6cdd0ab5046996bd52adda", + "usr/lib/modules/7.2.11-elementary-aurora72-wip4/kernel/drivers/hid/hid-magicmouse.ko": "d98405c7d1ff147bcff3b3c1e25cd286bd356c2384430ea72fc31449a51dafcb", + "usr/lib/modules/7.2.11-elementary-aurora72-wip4/kernel/drivers/hid/usbhid/usbhid.ko": "66eabef0f4963b6b6e14a0824d0f1a6192c67120fa56e54c7cf933e37ebb7304", + "usr/lib/modules/7.2.11-elementary-aurora72-wip4/kernel/drivers/md/dm-crypt.ko": "9658774c9dcfb8377acb89e97d550976c8e1fef3b28beb2d8f91ca3123e7fba7", + "usr/lib/modules/7.2.11-elementary-aurora72-wip4/kernel/drivers/md/dm-integrity.ko": "b93128dcd89a37139e451505d5efa9fc11f650fb8900d06be6fa8bcda072d369", + "usr/lib/modules/7.2.11-elementary-aurora72-wip4/kernel/drivers/mmc/core/mmc_block.ko": "9c96719a98ca696146b11b14e2b6ba7be90bd1a7b73e5ee4f13e28625ba9ac18", + "usr/lib/modules/7.2.11-elementary-aurora72-wip4/kernel/drivers/mmc/core/mmc_core.ko": "35eb4c8f9f096fe23022c4fc57bddbfc6198dcd00688dcb78ff1b2860e9284a0", + "usr/lib/modules/7.2.11-elementary-aurora72-wip4/kernel/drivers/mmc/host/cqhci.ko": "c5b3212d2871695c9bb3d55acbb3f11c06f5918c66ce99535679524af1d31fdb", + "usr/lib/modules/7.2.11-elementary-aurora72-wip4/kernel/drivers/mmc/host/sdhci-pci.ko": "46288b5549fdbc6e56bac344032841448f03d8839eb96acf1043683589d59284", + "usr/lib/modules/7.2.11-elementary-aurora72-wip4/kernel/drivers/mmc/host/sdhci-uhs2.ko": "94d10e903489277b9814af9440e476581b953bb607fd2ec6c3e7278fc3654fa1", + "usr/lib/modules/7.2.11-elementary-aurora72-wip4/kernel/drivers/mmc/host/sdhci.ko": "0d9dd5abce105b9fa61b0aeb699036c387ae24b25e59402aea30cc1d29497c15", + "usr/lib/modules/7.2.11-elementary-aurora72-wip4/kernel/drivers/mux/mux-apple-display-crossbar.ko": "1ee15dff92ea39751d7b4fcb7c9b5de589fd50af5d4f9cab5f5201e888516e38", + "usr/lib/modules/7.2.11-elementary-aurora72-wip4/kernel/drivers/phy/apple/phy-apple-atc.ko": "26c03278cf2d3361a7846d3bd68dd2cc5ab1ed56756849d08127b391227e7d86", + "usr/lib/modules/7.2.11-elementary-aurora72-wip4/kernel/drivers/usb/dwc3/dwc3-of-simple.ko": "4dc810f591aedddab71c27616c9ccedfdd1de4ec39f69cdc781fcf620857b2f2", + "usr/lib/modules/7.2.11-elementary-aurora72-wip4/kernel/drivers/usb/dwc3/dwc3.ko": "1827d477fbcd5314b8c2f4dce56d0d004c09c2f4fab7dd86cf07b6bc742cb5a8", + "usr/lib/modules/7.2.11-elementary-aurora72-wip4/kernel/drivers/usb/gadget/udc/udc-core.ko": "72062f3a348037c5d0c27b0659977250c81c22ddd6211ca47ad2e29fa58187eb", + "usr/lib/modules/7.2.11-elementary-aurora72-wip4/kernel/drivers/usb/host/xhci-hcd.ko": "9a19715026db5b371cdd053819aca2176ef3e7fe33808f9383755d200bbf5afa", + "usr/lib/modules/7.2.11-elementary-aurora72-wip4/kernel/drivers/usb/host/xhci-pci.ko": "ec0e4ce13a896ddfce8413c37c9eefeda76c3677ad5832e55850ad97a38d1094", + "usr/lib/modules/7.2.11-elementary-aurora72-wip4/kernel/drivers/usb/host/xhci-plat-hcd.ko": "0a1963c6953f33c67fd8dfd5c64bd51ad948192ec5b6fd5862ba0d03e8bb3c9c", + "usr/lib/modules/7.2.11-elementary-aurora72-wip4/kernel/drivers/usb/storage/uas.ko": "6dd33755a70be9019e738c54375cef20425c2b9e4e778fba59f0539fe26e99bf", + "usr/lib/modules/7.2.11-elementary-aurora72-wip4/kernel/drivers/usb/storage/usb-storage.ko": "e80270f00d312d05da538d25ab7d380a80b64145fff2f968f541d7adba698146", + "usr/lib/modules/7.2.11-elementary-aurora72-wip4/kernel/drivers/usb/typec/tipd/tps6598x-core.ko": "e8a4a7664f0ebe76cb340fdac65c664b4926a0c62b6dc2338b01655e79e7fa34", + "usr/lib/modules/7.2.11-elementary-aurora72-wip4/kernel/drivers/usb/typec/tipd/tps6598x.ko": "6a6442948fccd3a30cda9be4b672ef6f515b3e638fc252d3d682bcb33134939c", + "usr/lib/modules/7.2.11-elementary-aurora72-wip4/kernel/fs/btrfs/btrfs.ko": "360b2708742320b0e2e669a938c5c04a89327aae113694c3eceb277264350f1b", + "usr/lib/modules/7.2.11-elementary-aurora72-wip4/kernel/lib/842/842_compress.ko": "3edf7ecaae958f196b6adfe95110e566211fd6e5c6fae27f7222fefda2b03936", + "usr/lib/modules/7.2.11-elementary-aurora72-wip4/kernel/lib/842/842_decompress.ko": "8cd09351fed29e1238b45b452ce314c1e7341fbe4420e5636d232c4619ef7133", + "usr/lib/modules/7.2.11-elementary-aurora72-wip4/kernel/lib/crypto/libarc4.ko": "b878d9469a2373254dc3ee252b04e7f1773a83573f72d9f39d18d0700b8ae2b1", + "usr/lib/modules/7.2.11-elementary-aurora72-wip4/kernel/lib/crypto/libchacha20poly1305.ko": "2a0fb68a86b4c9e888d334006c4f7f646be55e2c5633a745073f5fdea5cbb591", + "usr/lib/modules/7.2.11-elementary-aurora72-wip4/kernel/lib/crypto/libcurve25519.ko": "b10c45b408f739fe9be511cc989ef526912fa9cb7b01e785d5e15b9636fcfed3", + "usr/lib/modules/7.2.11-elementary-aurora72-wip4/kernel/lib/crypto/libdes.ko": "48a9a63289ae0f9f05545af8467cb9968636b29a5ce4b81e815fe3aa52515831", + "usr/lib/modules/7.2.11-elementary-aurora72-wip4/kernel/lib/crypto/libnh.ko": "6a1887188f072188354ceda83d94684b485b3e8c8104887f1c6f1b5bf807f2e3", + "usr/lib/modules/7.2.11-elementary-aurora72-wip4/kernel/lib/crypto/libpoly1305.ko": "67958b21467fcb665cc9e3eb266acb235939beae7863c78e2a24d87052ce7f54", + "usr/lib/modules/7.2.11-elementary-aurora72-wip4/kernel/lib/crypto/libsm3.ko": "d023b13d853bc84605b23600eacfd64d2fad6a1c6de65b5fe36d23e41db6f3dc", + "usr/lib/modules/7.2.11-elementary-aurora72-wip4/kernel/lib/lz4/lz4_compress.ko": "e127372380831b900ced3c35a2d60e7d47a252e5191e1e6d6b8fc587335bcbdb", + "usr/lib/modules/7.2.11-elementary-aurora72-wip4/kernel/lib/lz4/lz4hc_compress.ko": "801c1ec60a311c5f11bb85d0a7dec97f1fe9f39e78feac41b2e2fd0ddeb3a371", + "usr/lib/modules/7.2.11-elementary-aurora72-wip4/kernel/lib/raid/raid6/raid6_pq.ko": "ee7fe4d6b7ebfb517f4386d53bf1db9dec1c734b0ae2463cad02ff026efff09b", + "usr/lib/modules/7.2.11-elementary-aurora72-wip4/kernel/lib/raid/xor/xor.ko": "3b101bb6fd61c6b60b00c985d7442a489fa419dcc186952b3fdfe800d956e7bc" + }, + "shared_boot_sha256": "9c9c2d01c3bdb2784daf99cecd6f0e2327eb8f148ea43c8e522e5bae09a14d5f", + "shared_boot_change_required": false, + "shared_boot_policy": "Retain exact current 7.1 DTB/m1n1/U-Boot payload; legacy DART source checks are separate evidence.", + "original_custom_grub_sha256": "d896b4eb5f741b59a5a9d9109a11b87794e92566adb801a163c6345f3e1781ea", + "proposed_custom_grub_sha256": "a2c053e748e099615a5d9df8fb39fea6effba6e0a765c536c6803dc1f15a0edc", + "persistent_default": "elementary-aurora20", + "trial_entry": "elementary-aurora72-wip4-trial", + "installed": false, + "armed": false, + "rebooted": false +} diff --git a/mseries/aurora/unified72/native-build-wip4-2026-10-23.json b/mseries/aurora/unified72/native-build-wip4-2026-10-23.json new file mode 100644 index 000000000..e77a170b1 --- /dev/null +++ b/mseries/aurora/unified72/native-build-wip4-2026-10-23.json @@ -0,0 +1,180 @@ +{ + "schema": 1, + "kind": "native-arm64-build-artifact-audit", + "audited_at": "2026-10-26T11:27:56+00:00", + "tested_repository_commit": "266d54af49ca6dede2492f11b4fe830cafa7228a", + "artifact_id": 12499308513, + "artifact_name": "elementary-aurora-enhancements-unified72-39944207967", + "artifact_zip_sha256": "51d994c59ddb228f8dbb22819eb49e2e49f9ba9fc817ea49bf18a718b9ef2cd2", + "github_artifact_digest_matched": true, + "ci_run": "https://github.com/techmore/ElementaryOS_MSeries/actions/runs/39944207967", + "artifact_url": "https://github.com/techmore/ElementaryOS_MSeries/actions/runs/39944207967/artifacts/12499308513", + "checksums_verified": { + "build.config": "01bec2b49d984b1f74b7fbd254aed02e97eb0ce47ecc46fd463ce02727796ece", + "linux-7.2.11-elementary-aurora72-wip4-source.tar.gz": "04432ad6cabd84eb9c65522bfd90e46998fab07401c25c085da8f99825b8b5ec", + "linux-image-elementary-aurora72-wip4_7.2.11+elementary.aurora72.wip4-1_arm64.deb": "7811064c1e5987f969b2f2c72ff06c44fea25d429e286917f844e457bcc7d8d9", + "provenance.json": "e7dd652405cbd3482c59ba4bdff70b06cccf3009c29d3236276717a483bcf55f" + }, + "source_files_verified": 17, + "not_done": [ + "base source archive was not independently reconstructed from the pinned codeload archive", + "initramfs and trial boot entry are prepared separately; no kernel install, boot payload change or hardware boot" + ], + "package": { + "control": "Package: linux-image-elementary-aurora72-wip4\nVersion: 7.2.11+elementary.aurora72.wip4-1\nArchitecture: arm64\nMaintainer: ElementaryOS MSeries contributors \nInstalled-Size: 154996\nSection: kernel\nPriority: optional\nDepends: kmod\nDescription: Experimental Aurora enhancement kernel payload\n Distinct modules directory, no boot hooks; requires explicit boot-chain staging.\n", + "module_files": 1876, + "apple_dtbs": 115, + "image_sha256": "25e6f772200147cd843ef8aa46ffc4a44a14f5e123a41cb28ebe5e10aad0a3bb", + "j314s_dtb": "dtbs/t6000-j314s.dtb present" + }, + "provenance": { + "profile": "unified72", + "kernel_release": "7.2.11-elementary-aurora72-wip4", + "base_pins": { + "repository": "omacom/linux-aurora", + "release": "aurora-2026.10.17.20", + "kernel_source": "c46d7dcdb8712ea9aeb0ce47b439ffae76371e55", + "kernel_release": "7.1.12-2-20261017.20-sep-ARCH", + "debian_package": "linux-image-elementary-aurora20", + "debian_version": "7.1.12+aurora.20261017.20-1", + "recipe_config_sha256": "c811698c5242d42850bef6669f29cd7b485e997d3ac1a423e2d3cbbb3fdc19b8", + "m1n1_source": "https://github.com/omacom/m1n1/tree/d05ba17dfb771871d608225be42968bbb1e75a18", + "assets": { + "kernel": { + "name": "linux-aurora-7.1.12.aurora2-20261017.20-aarch64.pkg.tar.zst", + "sha256": "49efa0ec088059aaae6c1fc7fef49521171abbab2c21a3d62bf670148dc0c7d8" + }, + "recipe": { + "name": "linux-aurora-recipe-20261017.20.tar.gz", + "sha256": "6e5ff423f0ef07d6e478c39c8c9c0739a2cc12050afa8c9f90ec49e5bd0ddcc3" + }, + "source": { + "name": "aurora-linux-c46d7dcdb8712ea9aeb0ce47b439ffae76371e55.tar.gz", + "sha256": "493ed9fb4a9e245fd59a92a2396d3c968516be932749b8059757a29380652509" + }, + "m1n1": { + "name": "m1n1-aurora-1.6.1.aurora17-5-aarch64.pkg.tar.zst", + "sha256": "fd72ec6c7ff514a2fb17141ccd8ff94268e4412fc5660fb0db62564a036e30ca" + }, + "m1n1_source": { + "name": "m1n1-d05ba17dfb771871d608225be42968bbb1e75a18.tar.gz", + "url": "https://codeload.github.com/omacom/m1n1/tar.gz/d05ba17dfb771871d608225be42968bbb1e75a18", + "sha256": "45ecb3c3efa13409b148c1b76397ec0c5cb747d3fc5f049455601b4c65295fe8" + }, + "touchid": { + "name": "aurora-touchid-20261003-2-any.pkg.tar.zst", + "sha256": "84243a96fcabed344460c1dc67309730f03de34b9f1955faccbedc10c619c7c4" + }, + "libfprint": { + "name": "libfprint-1.94.100-1.1-aarch64.pkg.tar.zst", + "sha256": "bc7d9762db6644f2cfb58ddb209602c1d513845eb1498c098e01f12600fcbdf9" + } + } + }, + "series_sha256": "9b7c2283e7f407e6d930b297f2a29b4070376331c9a0532ed6b373dea3fa1158", + "patches": [ + { + "file": "0001-drm-apple-srgb-external-display-colour.patch", + "sha256": "9cd617e413c69006349e8ffa914ee0c16d1d7ba246d5afd9e1031aafbbf09573", + "upstream": "https://github.com/omacom/linux-aurora/pull/157", + "head": "9d3aeb24cb864d5f99a7172e9004884bf3c1a9a0", + "profile": "candidate", + "note": "drm/apple: sRGB surfaces and an sRGB link colorimetry for external displays (unmerged upstream PR #157, 5 files, +73/-6). Applies to the #158 head with small offsets; must be re-checked if #158 moves." + }, + { + "file": "0002-drm-apple-free-dp-tunnel-route-from-silent-dcpext.patch", + "sha256": "fdd6f9cd13ca90b4500130d289182eb69728e25afe5a5ed3f0c92571aa54fd1a", + "upstream": null, + "head": null, + "profile": "candidate", + "note": "drm/apple: local, not upstream. A DCP whose DPTX RemotePort times out is passed over for 300 s, and a timed-out release no longer pins the port's DP tunnel route to it. Applies after 0001 to the #158 source (checked against the exact files; full-tree apply is checked by candidate.py prepare and CI). Never built or booted." + }, + { + "file": "0003-udmabuf.patch", + "sha256": "980e441601ce890741a2bf9c741556e299e5c1ac8f05000991f333fcacbacc6e", + "upstream": "https://github.com/omacom/linux-aurora/pull/67", + "head": "6984b8c07e84b0cf528243db1838dade971ff513", + "profile": "candidate", + "note": "Unmodified upstream config patch; full recipe config is also checked by the build gate." + }, + { + "file": "0004-m3-thermal-fallback.patch", + "sha256": "acbb4af3e55004c3695b673b2e324e3af3e0db6d58bf2f4be7a939ee3b3a515c", + "upstream": "https://github.com/omacom/linux-aurora/pull/135", + "head": "46b5a0981c4955cf33b7275c4001d820791b9f08", + "profile": "candidate", + "note": "Local 7.2.11 port of PR #135 policy/tests. Dormant: this source has a compile-only M3 backend and refuses runtime startup; no thermal behavior is enabled." + }, + { + "file": "0005-j613-camera-147.patch", + "sha256": "5d868e19e9b0edbac4ce19d4954558f471800925937347bc902bd362a706ede0", + "upstream": "https://github.com/omacom/linux-aurora/pull/134", + "head": "06d77374e80cb1901fb2c283362abb242cd68c18", + "profile": "candidate", + "note": "Unmodified PR #134 patch; applies only to matching J613/T8122 firmware. Not relevant to the owner\u2019s J314S." + }, + { + "file": "0006-t8122-camera-2662.patch", + "sha256": "d8938f63279a913640d7af6abf00932298828f8968eba8c97e1ed311d9e7e310", + "upstream": "https://github.com/omacom/linux-aurora/pull/119", + "head": "4cf3221edd6befc79489ff4e2636e0b01e002ac7", + "profile": "candidate", + "note": "Unmodified PR #119 patch; requires matching m1n1 ISP-heap support and compatible device firmware. Not qualified on the owner\u2019s J314S." + }, + { + "file": "0007-macsmc-optional-properties.patch", + "sha256": "5b4f9ba92b99bf388be2c8a3ed11a8fb6caa760632e363aba3e53e5a6a66e5fe", + "upstream": "https://github.com/omacom/linux-aurora/commit/4676c48ecf1b1acaba7c442d33fe9aae0f037e77", + "head": "4676c48ecf1b1acaba7c442d33fe9aae0f037e77", + "profile": "candidate", + "note": "Upstream optional-property change, rebased for 7.2.11; retains charge and critical-battery behavior. Hardware telemetry remains unqualified here." + } + ], + "source_pin": { + "repository": "aurora-silicon/linux", + "commit": "bd526b3c11ccf8e91d6240261beb3219d8f17f03", + "git_url": "https://github.com/omacom/linux-aurora.git", + "git_tree_sha1": "a305f231d9137847c7f0ececca98e214cc30e792", + "upstream_pr": "https://github.com/omacom/linux-aurora/pull/158", + "name": "linux-aurora-bd526b3c11ccf8e91d6240261beb3219d8f17f03.tar.gz", + "url": "https://codeload.github.com/omacom/linux-aurora/tar.gz/bd526b3c11ccf8e91d6240261beb3219d8f17f03", + "archive_root": "linux-aurora-bd526b3c11ccf8e91d6240261beb3219d8f17f03", + "sha256": "881d5a061efa212ed28489311cc97ab6d9bf52891a6c7a00b18f0bbaff131957" + }, + "source_fetch_method": "pinned-archive-sha256", + "source_archive_sha256": "881d5a061efa212ed28489311cc97ab6d9bf52891a6c7a00b18f0bbaff131957", + "source_tree_sha256": "50e843dd4d99d3c0381959c23bae34a376108acee8f251c9748c13dfff7c93e9", + "modified_files": { + "arch/arm64/configs/asahi.config": "c87a3acbd59b1075dd704f62634a3f9df072c3bf8980ce57d154018c3ad14690", + "drivers/gpu/drm/apple/dcp-fabric-core.c": "39524b929f1b8db1cff77d795527d14b2ceacb10a6e572510c67dbf505ada150", + "drivers/gpu/drm/apple/dcp-fabric-core.h": "ed67bf386b0eee79be0f6c5b02a1e6c0503d1899c7faa2f4a0a23fb93d9f9496", + "drivers/gpu/drm/apple/dcp-fabric-test.c": "98a39f8d038182bdefdd69967fdcbd071db0e1f8ac64de2247ac29c2e43f7686", + "drivers/gpu/drm/apple/dcp-fabric.c": "2db503c77b7d1736e8b5189cb63024536729bf98bb27904225a363116fb9e22d", + "drivers/gpu/drm/apple/dcp-internal.h": "9b057bb150618f97ca40f8bf0ed714411cbc69f84c419b6796bed151b5437165", + "drivers/gpu/drm/apple/dcp.c": "a8631ad86e6c6c4d9fe1764688f819fe19edcbc816ce78956d0a50d9c46e69bd", + "drivers/gpu/drm/apple/iomfb_template.c": "c44bfaa534ad947b98d21f57ee82c42f17c6121b96cad915e39cfb15cd066808", + "drivers/gpu/drm/apple/parser.c": "9f75b92750c7b6faa53940918a3817153a8813f79f7546eeb1ced4c729b7b5d3", + "drivers/gpu/drm/apple/plane.c": "1150c28a458a469c5cd8effd754b59b6de9784d610426243cace2e7ff7052bff", + "drivers/gpu/drm/asahi/m3/m3_thermal_policy.rs": "53eeaf15c03646f89829b2ad7e7c95a3e944892018ce25a075c49a98b1eb690f", + "drivers/media/platform/apple/isp/isp-cam.c": "84693e8a69a370370367b4c84884f6e88b19c2b23eb9377985894a5f77da1f61", + "drivers/media/platform/apple/isp/isp-drv.c": "18de8ad86f8cf0120fa099ed02889b465882ffdad756e361d4242f36086536bb", + "drivers/media/platform/apple/isp/isp-drv.h": "d4d8a241e00f0224571797e95cf682daefef383f6cbc2a64728b25f2f05478f1", + "drivers/power/supply/macsmc-power.c": "b712fafdc4af1f1e47c68a15ca0140d410f9cd3f4b88e44593471bf49908eec2", + "localversion.elementary": "b04d4d92c4a89ec0f9ac08cc8f63a4f2bfa7612e0c09399136e85e6b2f7416cd", + "rust-toolchain.toml": "2a95563bb9f5b216cc3c170a17e9471448bc63a7084bdd67df23d074939b366c" + }, + "prepared_config_sha256": "20efc4af999b142e5cac358b9567a00a24bf3b687b30d47cadccc194c888126d", + "status": "ARM64 Image/modules/DTBs built; no hardware boot", + "package": "linux-image-elementary-aurora72-wip4_7.2.11+elementary.aurora72.wip4-1_arm64.deb", + "package_sha256": "7811064c1e5987f969b2f2c72ff06c44fea25d429e286917f844e457bcc7d8d9", + "source_sha256": "04432ad6cabd84eb9c65522bfd90e46998fab07401c25c085da8f99825b8b5ec", + "resolved_config_sha256": "01bec2b49d984b1f74b7fbd254aed02e97eb0ce47ecc46fd463ce02727796ece", + "rustc": "rustc 1.93.1 (01f6ddf75 2026-02-11)", + "clang": "Ubuntu clang version 22.1.2 (1ubuntu1)", + "package_compression": { + "format": "zstd", + "level": 3, + "max_threads": 4 + } + } +} diff --git a/mseries/aurora/unified72/patches/0002-drm-apple-free-dp-tunnel-route-from-silent-dcpext.patch b/mseries/aurora/unified72/patches/0002-drm-apple-free-dp-tunnel-route-from-silent-dcpext.patch new file mode 100644 index 000000000..f874d4963 --- /dev/null +++ b/mseries/aurora/unified72/patches/0002-drm-apple-free-dp-tunnel-route-from-silent-dcpext.patch @@ -0,0 +1,257 @@ +drm/apple: stop a silent external DCP from pinning a Thunderbolt DP route + +Local patch (not upstream), written 2026-10-22 against the #158 source plus +0001. Build-only; never booted. Evidence and reasoning: +mseries/aurora/hardware-tests/2026-10-22-j314s-wip3-dcpext1-dptx-wedge.md + +On the J314S, the first dock plug of a boot can be routed to dcpext1 +(28cc00000). Its AppleDCPDPTXRemotePort service then never answers: the link +validation times out, and so does every later call, including the release. +dcp_tb_release_locked() treats a refused release as "keep the route owned", +which is right for a refusal but wrong for a timeout: the port stays pinned to +the dead pipeline, and each new request on it first tries to release it again +and fails with -110 until reboot. Other ports are unaffected. + + - A DPTX call that times out marks that DCP's pipeline unresponsive for 300 s + (cleared when a connect gets an answer). + - An unresponsive pipeline is not offered to new tunnels or direct routes and + is not planned onto, unless a tunnel already holds it. With no other + pipeline free the request returns -EBUSY, so the Thunderbolt side waits and + asks again (apple_dpin capacity_retry) and lands on dcpext0 meanwhile. + - A release that times out is completed without the firmware: our view of the + display is dropped and the crossbar route freed, instead of kept owned. + +Not covered: moving a tunnel that already attached to the silent pipeline, +within the same plug, to another one. That needs the Thunderbolt side to +re-request the tunnel; see the evidence note. + +diff --git a/drivers/gpu/drm/apple/dcp-fabric-core.c b/drivers/gpu/drm/apple/dcp-fabric-core.c +--- a/drivers/gpu/drm/apple/dcp-fabric-core.c ++++ b/drivers/gpu/drm/apple/dcp-fabric-core.c +@@ -118,7 +118,7 @@ EXPORT_SYMBOL_GPL(dcp_fabric_presence_expire); + bool dcp_fabric_available(const struct dcp_fabric_pipeline *pipeline, + const struct dcp_fabric_policy *policy) + { +- return !pipeline->owned && !pipeline->fixed_busy && ++ return !pipeline->owned && !pipeline->fixed_busy && !pipeline->unresponsive && + (policy->dual_stream || pipeline->presence == DCP_FABRIC_ABSENT); + } + EXPORT_SYMBOL_GPL(dcp_fabric_available); +@@ -262,7 +262,9 @@ void dcp_fabric_plan(struct dcp_fabric_pipeline *pipelines, + } + /* The adapter supplies pipelines in CRTC index order. */ + for (pipeline = pipelines; pipeline; pipeline = pipeline->next) +- if (pipeline->tunnel_held || !pipeline->fixed_busy) ++ /* A held tunnel keeps its pairing; nothing new is planned onto a dead one. */ ++ if (pipeline->tunnel_held || ++ (!pipeline->fixed_busy && !pipeline->unresponsive)) + dcp_fabric_plan_pipeline(pipeline, ports, + arriving, dpin); + again = false; +diff --git a/drivers/gpu/drm/apple/dcp-fabric-core.h b/drivers/gpu/drm/apple/dcp-fabric-core.h +--- a/drivers/gpu/drm/apple/dcp-fabric-core.h ++++ b/drivers/gpu/drm/apple/dcp-fabric-core.h +@@ -29,6 +29,8 @@ struct dcp_fabric_pipeline { + enum dcp_fabric_presence_state presence; + bool terminal; + bool services_ready; ++ /* firmware DPTX service timed out lately: do not route a display here */ ++ bool unresponsive; + bool external; + bool t6030_dpin; + }; +diff --git a/drivers/gpu/drm/apple/dcp-fabric-test.c b/drivers/gpu/drm/apple/dcp-fabric-test.c +--- a/drivers/gpu/drm/apple/dcp-fabric-test.c ++++ b/drivers/gpu/drm/apple/dcp-fabric-test.c +@@ -483,6 +483,50 @@ static void fabric_scenario_test(struct kunit *test) + } + } + ++static void fabric_unresponsive_pipeline_test(struct kunit *test) ++{ ++ struct fabric_fixture f; ++ struct dcp_fabric_route *route; ++ int error; ++ ++ fabric_init(&f, false); ++ /* Without a fault the tunnel takes the lower-scoring pipeline 1. */ ++ route = dcp_fabric_tunnel_candidate(&f.port[0], &f.policy, NULL, false, ++ 0, true, &error); ++ KUNIT_ASSERT_PTR_EQ(test, route, &f.route[0][1]); ++ ++ /* A pipeline whose firmware service timed out is passed over. */ ++ f.pipeline[1].unresponsive = true; ++ KUNIT_EXPECT_FALSE(test, dcp_fabric_available(&f.pipeline[1], &f.policy)); ++ route = dcp_fabric_tunnel_candidate(&f.port[0], &f.policy, NULL, false, ++ 0, true, &error); ++ KUNIT_EXPECT_PTR_EQ(test, route, &f.route[0][0]); ++ KUNIT_EXPECT_EQ(test, error, 0); ++ ++ /* With nothing else free the request waits for a pipeline. */ ++ f.pipeline[0].unresponsive = true; ++ route = dcp_fabric_tunnel_candidate(&f.port[0], &f.policy, NULL, false, ++ 0, true, &error); ++ KUNIT_EXPECT_PTR_EQ(test, route, NULL); ++ KUNIT_EXPECT_EQ(test, error, -EBUSY); ++ ++ /* Planning leaves the dead pipeline out, so the next stream goes dark. */ ++ f.pipeline[0].unresponsive = false; ++ f.port[0].wanted = true; ++ f.port[0].hpd = true; ++ f.port[1].wanted = true; ++ f.port[1].hpd = true; ++ dcp_fabric_plan(f.pipeline, f.port, NULL, 0); ++ KUNIT_EXPECT_PTR_EQ(test, f.plan[0].target[0], &f.route[0][0]); ++ KUNIT_EXPECT_PTR_EQ(test, f.plan[1].target[0], NULL); ++ ++ /* Once the hold-off lapses the pipeline is used again. */ ++ f.pipeline[1].unresponsive = false; ++ dcp_fabric_plan(f.pipeline, f.port, NULL, 0); ++ KUNIT_EXPECT_PTR_EQ(test, f.plan[0].target[0], &f.route[0][0]); ++ KUNIT_EXPECT_PTR_EQ(test, f.plan[1].target[0], &f.route[1][1]); ++} ++ + static void fabric_dark_tunnel_test(struct kunit *test) + { + struct fabric_fixture f; +@@ -2290,6 +2334,7 @@ static struct kunit_case fabric_tests[] = { + KUNIT_CASE(fabric_capacity_notification_test), + KUNIT_CASE_PARAM(fabric_scenario_test, fabric_scenario_gen_params), + KUNIT_CASE(fabric_dark_tunnel_test), ++ KUNIT_CASE(fabric_unresponsive_pipeline_test), + KUNIT_CASE(fabric_effect_failure_core_test), + KUNIT_CASE(fabric_deactivate_failure_test), + KUNIT_CASE(fabric_unbound_and_mask_test), +diff --git a/drivers/gpu/drm/apple/dcp-fabric.c b/drivers/gpu/drm/apple/dcp-fabric.c +--- a/drivers/gpu/drm/apple/dcp-fabric.c ++++ b/drivers/gpu/drm/apple/dcp-fabric.c +@@ -890,6 +890,7 @@ static void dcp_fabric_snapshot_port(struct apple_dcp_typec_port *port, + pipeline->terminal = tunnel && dcpext_scanout_terminal(dcp); + pipeline->services_ready = !tunnel || + dcp_tb_services_ready(dcp); ++ pipeline->unresponsive = dcp_dptx_held_off(dcp); + pipeline->external = dcp->external; + route->core.pipeline = pipeline; + route->core.tunnel = route->tunnel; +@@ -2284,6 +2285,18 @@ static int dcp_tb_release_locked(struct apple_dcp_typec_port *port, + /* A refused display release keeps the route and its binding owned. */ + if (port->hpd || dcp->typec_cable_connected) { + ret = dcp_dptx_disconnect_oob(to_platform_device(dcp->dev), 0); ++ if (ret == -ETIMEDOUT) { ++ /* ++ * A service that does not answer cannot refuse: waiting for it ++ * would keep this port on a dead pipeline, and every later ++ * request would time out releasing it again. Free our side. ++ */ ++ dev_warn(dcp->dev, ++ "DPTX service not answering; releasing its DP tunnel route without it\n"); ++ dcp_dptx_note_timeout(dcp, ret); ++ dcp_dptx_abandon(dcp, 0); ++ ret = 0; ++ } + if (ret) + return ret; + } +diff --git a/drivers/gpu/drm/apple/dcp-internal.h b/drivers/gpu/drm/apple/dcp-internal.h +--- a/drivers/gpu/drm/apple/dcp-internal.h ++++ b/drivers/gpu/drm/apple/dcp-internal.h +@@ -72,6 +72,9 @@ void dcp_retry_placeholder_edid(struct apple_dcp *dcp, + const struct drm_edid *drm_edid); + bool dcp_typec_relink(struct apple_dcp *dcp); + bool dcp_typec_sink_relink(struct apple_dcp *dcp); ++bool dcp_dptx_held_off(struct apple_dcp *dcp); ++void dcp_dptx_note_timeout(struct apple_dcp *dcp, int err); ++void dcp_dptx_abandon(struct apple_dcp *dcp, u32 port); + + struct dcpav_service_epic; + +@@ -515,6 +518,9 @@ struct apple_dcp { + bool typec_cable_connected; + /* DPTX feeds a Thunderbolt DP IN adapter, not the Type-C PHY lanes */ + bool dptx_tunnel; ++ /* DPTX RemotePort timed out: jiffies until which no display is routed here */ ++ bool dptx_holdoff; ++ unsigned long dptx_holdoff_until; + /* DFP port in the DPTX target: 0 = dpphy, 1 = dpin0, 2 = dpin1 */ + u8 dptx_dfp_port; + /* wakes/sleeps the Thunderbolt DP IN adapter from DCP Activate/Deactivate */ +diff --git a/drivers/gpu/drm/apple/dcp.c b/drivers/gpu/drm/apple/dcp.c +--- a/drivers/gpu/drm/apple/dcp.c ++++ b/drivers/gpu/drm/apple/dcp.c +@@ -980,6 +980,8 @@ int dcp_get_connector_type(struct platform_device *pdev) + #define DPTX_TUNNEL_CONNECT_TIMEOUT msecs_to_jiffies(8000) + #define DPTX_RECONNECT_DELAY msecs_to_jiffies(1000) + #define DPTX_RECONNECT_RETRIES 5 ++/* How long a pipeline whose DPTX service timed out is passed over. */ ++#define DCP_DPTX_HOLDOFF msecs_to_jiffies(300 * MSEC_PER_SEC) + + /* + * The connection a DPTX connect or queued reconnect belongs to: the Type-C +@@ -1135,6 +1137,7 @@ static int dcp_dptx_connect_raw(struct apple_dcp *dcp, u32 port, bool *retryable + dev_err(dcp->dev, + "dcp_dptx_connect: failed to validate DPTX target %u:%u: %d\n", + dcp->dptx_die, dcp->dptx_phy, ret); ++ dcp_dptx_note_timeout(dcp, ret); + goto out_unlock; + } + } +@@ -1151,8 +1154,11 @@ static int dcp_dptx_connect_raw(struct apple_dcp *dcp, u32 port, bool *retryable + dev_err(dcp->dev, + "dcp_dptx_connect: failed to connect DPTX target %u:%u: %d\n", + dcp->dptx_die, dcp->dptx_phy, ret); ++ dcp_dptx_note_timeout(dcp, ret); + goto out_unlock; + } ++ /* The service answered: whatever held this pipeline off is over. */ ++ WRITE_ONCE(dcp->dptx_holdoff, false); + + if (!dcp_connect_session_valid_locked(dcp, session, cable, recovery)) { + ret = -ESTALE; +@@ -2188,6 +2194,47 @@ static int dcp_dptx_release_locked(struct apple_dcp *dcp, u32 port) + return 0; + } + ++/* ++ * A DPTX RemotePort call that times out means the firmware service itself ++ * is not answering, not that it refused: every later call waits out its ++ * timeout too. Remember it for a while, so the display fabric routes new ++ * displays to another pipeline instead of back to this one. ++ */ ++void dcp_dptx_note_timeout(struct apple_dcp *dcp, int err) ++{ ++ if (err != -ETIMEDOUT) ++ return; ++ /* Each failed retry extends the hold-off; say so once. */ ++ if (!dcp_dptx_held_off(dcp)) ++ dev_warn(dcp->dev, ++ "DPTX service not answering; routing displays elsewhere for %u s\n", ++ jiffies_to_msecs(DCP_DPTX_HOLDOFF) / MSEC_PER_SEC); ++ WRITE_ONCE(dcp->dptx_holdoff_until, jiffies + DCP_DPTX_HOLDOFF); ++ WRITE_ONCE(dcp->dptx_holdoff, true); ++} ++ ++bool dcp_dptx_held_off(struct apple_dcp *dcp) ++{ ++ return READ_ONCE(dcp->dptx_holdoff) && ++ time_before(jiffies, READ_ONCE(dcp->dptx_holdoff_until)); ++} ++ ++/* ++ * Drop our own view of a display the firmware can no longer be asked to ++ * release, so that the route it held can be freed. If the firmware comes ++ * back, the next connection starts from scratch. ++ */ ++void dcp_dptx_abandon(struct apple_dcp *dcp, u32 port) ++{ ++ guard(mutex)(&dcp->hpd_mutex); ++ if (dcp->external) { ++ smp_store_release(&dcp->external_link_ready, false); ++ dcpext_scanout_invalidate(dcp); ++ } ++ dcp->dptxport[port].connected = false; ++ WRITE_ONCE(dcp->dptxport[port].tile_hint, false); ++} ++ + int dcp_dptx_disconnect(struct apple_dcp *dcp, u32 port) + { + int ret; diff --git a/mseries/aurora/unified72/patches/0003-udmabuf.patch b/mseries/aurora/unified72/patches/0003-udmabuf.patch new file mode 100644 index 000000000..2cfaee3ab --- /dev/null +++ b/mseries/aurora/unified72/patches/0003-udmabuf.patch @@ -0,0 +1,34 @@ +From 6984b8c07e84b0cf528243db1838dade971ff513 Mon Sep 17 00:00:00 2001 +From: Joshua Warren <816217+joshuaswarren@users.noreply.github.com> +Date: Sun, 11 Oct 2026 13:36:37 -0500 +Subject: [PATCH 1/2] config: build udmabuf and the system dma-buf heap into + the Aurora kernel + +Local AI runtimes need GPU-visible host memory without a copy. Honeykrisp +already imports dma-bufs. The kernel config did not offer a way to make one +from ordinary pages: CONFIG_UDMABUF and CONFIG_DMABUF_HEAPS were off. + +Enable CONFIG_UDMABUF, CONFIG_DMABUF_HEAPS and CONFIG_DMABUF_HEAPS_SYSTEM, +all built in. A memfd then becomes a dma-buf through /dev/udmabuf, and the +GPU driver imports it without a staging copy. + +No driver code changes. The change adds three lines to the arm64 config fragment. +--- + arch/arm64/configs/asahi.config | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/arch/arm64/configs/asahi.config b/arch/arm64/configs/asahi.config +index 1e05c59146c1fa..f0030c98cfac40 100644 +--- a/arch/arm64/configs/asahi.config ++++ b/arch/arm64/configs/asahi.config +@@ -45,6 +45,9 @@ CONFIG_DRM_APPLE_AUDIO=y + CONFIG_DRM_ACCEL=y + CONFIG_DRM_ACCEL_ANE=m + CONFIG_DRM_SIMPLEDRM=y ++CONFIG_UDMABUF=y ++CONFIG_DMABUF_HEAPS=y ++CONFIG_DMABUF_HEAPS_SYSTEM=y + CONFIG_SND_SOC_APPLE_AOP_AUDIO=m + CONFIG_SND_SOC_APPLE_T8140_AOP_AUDIO=m + CONFIG_SND_SOC_APPLE_MCA=m + diff --git a/mseries/aurora/unified72/patches/0004-m3-thermal-fallback.patch b/mseries/aurora/unified72/patches/0004-m3-thermal-fallback.patch new file mode 100644 index 000000000..467abfdf2 --- /dev/null +++ b/mseries/aurora/unified72/patches/0004-m3-thermal-fallback.patch @@ -0,0 +1,85 @@ +From: MSeries Aurora integration +Subject: [PATCH] drm/asahi: port the T8122 thermal fallback policy to 7.2.11 + +Port the pure fallback calculation and its policy controls from Aurora PR #135 +onto the 7.2.11 M3 thermal policy module. The 7.2.11 M3 backend is compile-only +and refuses runtime startup, so this remains dormant policy code; it does not +change the M1 Pro or enable T8122 GPU runtime. + +diff --git a/drivers/gpu/drm/asahi/m3/m3_thermal_policy.rs b/drivers/gpu/drm/asahi/m3/m3_thermal_policy.rs +index 11901c9..e068916 100644 +--- a/drivers/gpu/drm/asahi/m3/m3_thermal_policy.rs ++++ b/drivers/gpu/drm/asahi/m3/m3_thermal_policy.rs +@@ -6,6 +6,12 @@ + //! Times are monotonic nanoseconds from any fixed origin, temperatures millidegrees Celsius, and + //! states indices of the published performance-state table. + ++/// The T8122 Air thermal fallback stays at state two when an experimental ceiling is raised. ++/// Other SoCs retain their existing fallback, and lower requested ceilings remain respected. ++pub(crate) fn safe_cap(max: u32, t8122: bool, legacy_limit: u32) -> u32 { ++ max.min(if t8122 { 2 } else { legacy_limit }) ++} ++ + /// Required thermal-zone bits: SMC die (bit 0), PMP hotspot (bit 1). + /// A missing or malformed compatible list requires both zones. + pub(crate) fn required_zones(compatible: &[u8]) -> u32 { +@@ -281,3 +287,59 @@ mod zone_tests { + assert_eq!(required_zones(b"apple,t81220\0"), 0); + } + } ++ ++#[cfg(test)] ++mod fallback_tests { ++ use super::*; ++ ++ fn temp(mc: i32, at: i64) -> Reading { ++ Reading::Temp { mc, at, zones: 1 } ++ } ++ ++ #[test] ++ fn t8122_higher_ceilings_keep_state_two_fallback() { ++ for ceiling in 1..=5 { ++ assert_eq!(safe_cap(ceiling, true, 5), ceiling.min(2)); ++ assert_eq!(safe_cap(ceiling, false, 5), ceiling); ++ } ++ assert_eq!(safe_cap(8, false, 5), 5); ++ } ++ ++ #[test] ++ fn missing_or_hot_readings_return_to_t8122_state_two() { ++ for reading in [ ++ temp(80_000, 3 * S), ++ temp(88_000, 3 * S), ++ Reading::None, ++ Reading::Failed { errno: -19, at: 3 * S }, ++ ] { ++ let mut policy = Policy::new(true, safe_cap(3, true, 5), 3, 80_000); ++ assert_eq!(policy.cap(), 2); ++ let _ = policy.update(0, temp(50_000, 0)); ++ assert_eq!(policy.cap(), 3); ++ let _ = policy.update(3 * S, reading); ++ assert_eq!(policy.cap(), 2); ++ } ++ } ++ ++ #[test] ++ fn stale_or_stuck_sensor_returns_to_t8122_state_two() { ++ let mut policy = Policy::new(true, safe_cap(3, true, 5), 3, 80_000); ++ let _ = policy.update(0, temp(50_000, 0)); ++ assert_eq!(policy.cap(), 3); ++ let _ = policy.update(4 * S, temp(50_000, 0)); ++ assert_eq!(policy.cap(), 2); ++ let _ = policy.update(6 * S, temp(51_000, 6 * S)); ++ assert_eq!(policy.cap(), 3); ++ let _ = policy.update(67 * S, temp(51_000, 67 * S)); ++ assert_eq!(policy.cap(), 2); ++ } ++ ++ #[test] ++ fn hold_keeps_t8122_at_state_two() { ++ let mut policy = Policy::new(false, safe_cap(3, true, 5), 3, 80_000); ++ let _ = policy.update(0, temp(50_000, 0)); ++ let _ = policy.update(3 * S, temp(50_000, 3 * S)); ++ assert_eq!(policy.cap(), 2); ++ } ++} diff --git a/mseries/aurora/unified72/patches/0005-j613-camera-147.patch b/mseries/aurora/unified72/patches/0005-j613-camera-147.patch new file mode 100644 index 000000000..40e8e7bb8 --- /dev/null +++ b/mseries/aurora/unified72/patches/0005-j613-camera-147.patch @@ -0,0 +1,76 @@ +From 16e0943fa458a213362d498ff92a6893eb45b893 Mon Sep 17 00:00:00 2001 +From: garymeyerca <220751193+garymeyerca@users.noreply.github.com> +Date: Fri, 16 Oct 2026 17:04:02 -0400 +Subject: [PATCH 1/2] media: apple: isp: correct the T8122 PMU base address + +The extra trailing zero places the PMU address outside the PMGR range +on J613. Correcting it resolves the probe-time firmware translation +fault on a J613 running firmware compatibility 14.7. + +Hardware tested as a module override on the original PR95 kernel, +7.1.12-2-20261013.95-sep-ARCH. Rebased integration source has separate +hardware qualification pending. + +Link: https://github.com/omacom/linux-aurora/issues/117 +Assisted-by: Codex:GPT-6 +--- + drivers/media/platform/apple/isp/isp-drv.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/media/platform/apple/isp/isp-drv.c b/drivers/media/platform/apple/isp/isp-drv.c +index 9f5f8f58b3748e..88a2e014fabc68 100644 +--- a/drivers/media/platform/apple/isp/isp-drv.c ++++ b/drivers/media/platform/apple/isp/isp-drv.c +@@ -653,7 +653,7 @@ static const struct apple_isp_hw apple_isp_hw_t6020 = { + + static const struct apple_isp_hw apple_isp_hw_t8122 = { + .gen = ISP_GEN_T8112, +- .pmu_base = 0x2d07040000, ++ .pmu_base = 0x2d0704000, + + .dsid_count = 1, + .dsid_clr_base0 = 0x2221c4000, + +From 06d77374e80cb1901fb2c283362abb242cd68c18 Mon Sep 17 00:00:00 2001 +From: garymeyerca <220751193+garymeyerca@users.noreply.github.com> +Date: Fri, 16 Oct 2026 17:04:02 -0400 +Subject: [PATCH 2/2] media: apple: isp: use temporal filter zero on J613 + firmware 14.7 + +On the tested J613, m1n1 supplies temporal-filter=1. The PMU fix permits +startup but this filter yields no output frames. Selecting filter 0 +delivers 1920x1080 NV12 at about 30 fps with the existing CNR, MBNR and +temporal processing commands retained. + +Limit the workaround to J613, firmware compatibility 14.7, and filter 1. +This complements the 26.6.2 camera work; that firmware's processing +strategy is unchanged. + +Hardware tested as a module override on the original PR95 kernel. +Rebased integration source has separate hardware qualification pending. + +Link: https://github.com/omacom/linux-aurora/issues/117 +Assisted-by: Codex:GPT-6 +--- + drivers/media/platform/apple/isp/isp-drv.c | 8 ++++++++ + 1 file changed, 8 insertions(+) + +diff --git a/drivers/media/platform/apple/isp/isp-drv.c b/drivers/media/platform/apple/isp/isp-drv.c +index 88a2e014fabc68..495c8fd822332a 100644 +--- a/drivers/media/platform/apple/isp/isp-drv.c ++++ b/drivers/media/platform/apple/isp/isp-drv.c +@@ -407,6 +407,14 @@ static int apple_isp_probe(struct platform_device *pdev) + if (err) + isp->temporal_filter = 0; + ++ /* J613 firmware 14.7 stalls capture with temporal filter 1. */ ++ if (of_machine_is_compatible("apple,j613") && ++ isp->fw_compat == ISP_FIRMWARE_V_14_7 && ++ isp->temporal_filter == 1) { ++ dev_info(dev, "using temporal filter 0 on J613 firmware 14.7\n"); ++ isp->temporal_filter = 0; ++ } ++ + err = apple_isp_init_presets(isp); + if (err) { + dev_err(dev, "failed to initialize presets\n"); diff --git a/mseries/aurora/unified72/patches/0006-t8122-camera-2662.patch b/mseries/aurora/unified72/patches/0006-t8122-camera-2662.patch new file mode 100644 index 000000000..44798c520 --- /dev/null +++ b/mseries/aurora/unified72/patches/0006-t8122-camera-2662.patch @@ -0,0 +1,170 @@ +From 4300575e2b54eaafe430b271fd39d6de57427d1e Mon Sep 17 00:00:00 2001 +From: Scott Jones +Date: Tue, 13 Oct 2026 22:16:10 -0400 +Subject: [PATCH 1/2] media: apple: isp: recognise the 26.6.2 firmware + +m1n1 sets apple,firmware-version and apple,firmware-compat to 26.6.2 on a +13" M3 MacBook Air (J613) whose stub runs macOS 26.6.2 (25G83) OS +firmware. The driver did not know that version, so fw_compat was unknown +and isp_cmd_ch_set_file_load() sent the 32-bit CH_SET_FILE_LOAD record. +The 26.6.2 firmware reads the 64-bit layout: it took the setfile address +from the wrong fields and faulted on it (FFW_Platform_Catch, far +0x3c00101c000, the data surface at 0x101c000 with garbage above it), and +every later command timed out. + +Recognise 26.6.2, which orders after 14.7, so the 64-bit record is used. +That is the only place the driver compares fw_compat. + +Tested on J613 (system firmware 27.0, OS firmware 26.6.2): the setfile +loads in about 1 ms instead of faulting. + +Assisted-by: Claude:claude-opus-5-5 +Signed-off-by: Scott Jones +--- + drivers/media/platform/apple/isp/isp-drv.c | 4 ++++ + drivers/media/platform/apple/isp/isp-drv.h | 1 + + 2 files changed, 5 insertions(+) + +diff --git a/drivers/media/platform/apple/isp/isp-drv.c b/drivers/media/platform/apple/isp/isp-drv.c +index 9f5f8f58b3748e..75e2ac8aae029d 100644 +--- a/drivers/media/platform/apple/isp/isp-drv.c ++++ b/drivers/media/platform/apple/isp/isp-drv.c +@@ -300,6 +300,8 @@ static const char * isp_fw2str(enum isp_firmware_version version) + return "13.5"; + case ISP_FIRMWARE_V_14_7: + return "14.7"; ++ case ISP_FIRMWARE_V_26_6_2: ++ return "26.6.2"; + default: + return "unknown"; + } +@@ -329,6 +331,8 @@ static enum isp_firmware_version isp_read_fw_version(struct device *dev, + return ISP_FIRMWARE_V_13_5; + else if (ver[0] == 14 && ver[1] == 7 && ver[2] == 0) + return ISP_FIRMWARE_V_14_7; ++ else if (ver[0] == 26 && ver[1] == 6 && ver[2] == 2) ++ return ISP_FIRMWARE_V_26_6_2; + + dev_warn(dev, "unknown %s: %d.%d.%d\n", name, ver[0], ver[1], ver[2]); + break; +diff --git a/drivers/media/platform/apple/isp/isp-drv.h b/drivers/media/platform/apple/isp/isp-drv.h +index bb7725cbd02b05..71af093ece6598 100644 +--- a/drivers/media/platform/apple/isp/isp-drv.h ++++ b/drivers/media/platform/apple/isp/isp-drv.h +@@ -76,6 +76,7 @@ enum isp_firmware_version { + ISP_FIRMWARE_V_12_4, + ISP_FIRMWARE_V_13_5, + ISP_FIRMWARE_V_14_7, ++ ISP_FIRMWARE_V_26_6_2, + }; + + struct isp_surf { + +From 4cf3221edd6befc79489ff4e2636e0b01e002ac7 Mon Sep 17 00:00:00 2001 +From: Scott Jones +Date: Tue, 13 Oct 2026 22:17:43 -0400 +Subject: [PATCH 2/2] media: apple: isp: stream the IMX558 on 26.6.2 firmware + +With the 26.6.2 firmware recognised, the J613 IMX558 streams once two +more things change for that firmware: + +- Setfile: use 1925_03, the header version 0x21 IMX558 setfile in the + 26.6.2 (25G83) appleh16camerad, as the H17 firmware already does. + 1925_03 is what this was tested with; 1921_01 crashed the firmware + before the CH_SET_FILE_LOAD fix and was not retried after it. + +- Temporal filter: do not enable MBNR, the temporal filter or motion + history. This firmware runs them through the neural engine (it logs + "MLVNR ... aneclient not ready"). With them enabled, the sensor + streams, but every frame stays in the temporal filter's input queue: + the firmware reports "Raw output buffer unavailable" and "Host + metadata unavailable", delivers nothing, and asserts in + CVideoFlowH15Cmd.cpp line 714 when the stream is stopped. With them + off, frames reach the host. + +H17 and older firmware are unchanged. + +Tested on J613 (system firmware 27.0, OS firmware 26.6.2, m1n1 with an +ISP heap for T8122 on 26.6.2): 1920x1080 NV12 at 30 fps, exposed and in +colour with the setfile; two streams in a row, with the firmware stopped +and booted again in between. + +Assisted-by: Claude:claude-opus-5-5 +Signed-off-by: Scott Jones +--- + drivers/media/platform/apple/isp/isp-cam.c | 46 +++++++++++++++------- + 1 file changed, 32 insertions(+), 14 deletions(-) + +diff --git a/drivers/media/platform/apple/isp/isp-cam.c b/drivers/media/platform/apple/isp/isp-cam.c +index 5090ed2ed5b985..616590de2f8734 100644 +--- a/drivers/media/platform/apple/isp/isp-cam.c ++++ b/drivers/media/platform/apple/isp/isp-cam.c +@@ -119,8 +119,13 @@ static int isp_ch_get_sensor_id(struct apple_isp *isp, u32 ch) + id = ISP_IMX514_2820_01; + break; + case 0x558: +- /* The H17 firmware only parses header version 0x21 setfiles. */ +- if (isp->hw->fw_abi == ISP_FW_ABI_H17) ++ /* ++ * The H17 firmware only parses header version 0x21 setfiles. ++ * 26.6.2 (J613) streams with 1925_03, the header version 0x21 ++ * setfile in that release's appleh16camerad. ++ */ ++ if (isp->hw->fw_abi == ISP_FW_ABI_H17 || ++ isp->fw_compat >= ISP_FIRMWARE_V_26_6_2) + id = ISP_IMX558_1925_03; + else + id = ISP_IMX558_1921_01; +@@ -504,9 +509,19 @@ static int isp_ch_configure_capture(struct apple_isp *isp, u32 ch) + if (err) + return err; + +- err = isp_cmd_ch_mbnr_enable(isp, ch, 0, ISP_MBNR_MODE_ENABLE, 1); +- if (err) +- return err; ++ /* ++ * 26.6.2 firmware on T8122 runs MBNR and the temporal filter through ++ * the neural engine ("aneclient not ready"). With neither started, ++ * frames go straight to the host; with them, every frame waits in ++ * the temporal filter until the firmware asserts. ++ */ ++ bool temporal = h17 || isp->fw_compat < ISP_FIRMWARE_V_26_6_2; ++ ++ if (temporal) { ++ err = isp_cmd_ch_mbnr_enable(isp, ch, 0, ISP_MBNR_MODE_ENABLE, 1); ++ if (err) ++ return err; ++ } + + /* The H17 firmware faults on this face-detection metering setup. */ + if (!h17) { +@@ -538,17 +553,20 @@ static int isp_ch_configure_capture(struct apple_isp *isp, u32 ch) + return err; + } + +- err = isp_cmd_apple_ch_temporal_filter_start(isp, ch, isp->temporal_filter); +- if (err) +- return err; ++ if (temporal) { ++ err = isp_cmd_apple_ch_temporal_filter_start(isp, ch, ++ isp->temporal_filter); ++ if (err) ++ return err; + +- err = isp_cmd_apple_ch_motion_history_start(isp, ch); +- if (err) +- return err; ++ err = isp_cmd_apple_ch_motion_history_start(isp, ch); ++ if (err) ++ return err; + +- err = isp_cmd_apple_ch_temporal_filter_enable(isp, ch); +- if (err) +- return err; ++ err = isp_cmd_apple_ch_temporal_filter_enable(isp, ch); ++ if (err) ++ return err; ++ } + + if (h17) + return isp_cmd_ch_master_slave_sync_mode_set(isp, ch, 0); diff --git a/mseries/aurora/unified72/patches/0007-macsmc-optional-properties.patch b/mseries/aurora/unified72/patches/0007-macsmc-optional-properties.patch new file mode 100644 index 000000000..edeed0f7c --- /dev/null +++ b/mseries/aurora/unified72/patches/0007-macsmc-optional-properties.patch @@ -0,0 +1,107 @@ +From 4676c48ecf1b1acaba7c442d33fe9aae0f037e77 Mon Sep 17 00:00:00 2001 +From: LiamRay11 <228416644+LiamRay11@users.noreply.github.com> +Date: Sun, 6 Sep 2026 02:39:44 -0700 +Subject: [PATCH] power: supply: macsmc: discover readable optional gauge + properties + +A missing BITV key on J700 makes voltage_min_design fail and aborts the battery uevent. Advertise optional gauge properties only when key metadata permits a read, the size matches, and the complete value can be read. + +The discovery helper passes missing-key, wrong-size, unreadable, failed-read and short-read cases under ASan/UBSan. The driver compiles for ARM64; the same discovery logic restored complete supply uevents in the J700 telemetry hardware trial. + +Signed-off-by: LiamRay11 <228416644+LiamRay11@users.noreply.github.com> +Rebased for c46d7dcd by ElementaryOS MSeries contributors: replace the four +key-existence guards with full readability/size/read discovery; preserve all +newer charging policy and critical-battery handling. + +--- +diff --git a/drivers/power/supply/macsmc-power.c b/drivers/power/supply/macsmc-power.c +--- a/drivers/power/supply/macsmc-power.c ++++ b/drivers/power/supply/macsmc-power.c +@@ -836,6 +836,58 @@ + return NOTIFY_DONE; + } + ++/* ++ * Optional gauge keys differ between firmware generations. Do not advertise ++ * an unreadable field: an EIO from one field aborts the entire supply uevent. ++ */ ++static int macsmc_battery_optional_properties(struct macsmc_power *power, ++ enum power_supply_property *props, ++ int nprops) ++{ ++ static const struct { ++ enum power_supply_property property; ++ smc_key key; ++ u8 size; ++ } optional[] = { ++#define BATT_OPTIONAL(prop, key, size) { POWER_SUPPLY_PROP_##prop, SMC_KEY(key), size } ++ BATT_OPTIONAL(TIME_TO_EMPTY_NOW, B0TE, 2), ++ BATT_OPTIONAL(TIME_TO_FULL_NOW, B0TF, 2), ++ BATT_OPTIONAL(VOLTAGE_MIN_DESIGN, BITV, 2), ++ BATT_OPTIONAL(VOLTAGE_MAX_DESIGN, BVVN, 2), ++ BATT_OPTIONAL(VOLTAGE_MIN, BLPM, 2), ++ BATT_OPTIONAL(VOLTAGE_MAX, BLPX, 2), ++ BATT_OPTIONAL(CHARGE_TERM_CURRENT, B0RC, 2), ++ BATT_OPTIONAL(CONSTANT_CHARGE_CURRENT_MAX, B0RI, 2), ++ BATT_OPTIONAL(CONSTANT_CHARGE_VOLTAGE, B0RV, 2), ++ BATT_OPTIONAL(CHARGE_FULL_DESIGN, B0DC, 2), ++ BATT_OPTIONAL(CHARGE_FULL, B0FC, 2), ++ BATT_OPTIONAL(CHARGE_NOW, B0RM, 2), ++ BATT_OPTIONAL(ENERGY_FULL_DESIGN, B0DC, 2), ++ BATT_OPTIONAL(ENERGY_FULL, B0FC, 2), ++ BATT_OPTIONAL(ENERGY_NOW, B0RM, 2), ++ BATT_OPTIONAL(CHARGE_COUNTER, BAAC, 8), ++#undef BATT_OPTIONAL ++ }; ++ struct apple_smc_key_info info; ++ u8 value[8]; ++ int i, ret; ++ ++ for (i = 0; i < ARRAY_SIZE(optional); i++) { ++ ret = apple_smc_get_key_info(power->smc, optional[i].key, &info); ++ if (ret || info.size != optional[i].size || ++ !(info.flags & APPLE_SMC_READABLE)) ++ continue; ++ ret = apple_smc_read(power->smc, optional[i].key, value, info.size); ++ if (ret != info.size) { ++ dev_dbg(power->dev, "Skipping unreadable optional battery key %08x (%d)\n", ++ optional[i].key, ret); ++ continue; ++ } ++ props[nprops++] = optional[i].property; ++ } ++ return nprops; ++} ++ + static int macsmc_power_probe(struct platform_device *pdev) + { + struct device *dev = &pdev->dev; +@@ -914,27 +966,7 @@ + props[nprops++] = POWER_SUPPLY_PROP_MANUFACTURE_MONTH; + props[nprops++] = POWER_SUPPLY_PROP_MANUFACTURE_DAY; + +- /* Extended properties usually present */ +- props[nprops++] = POWER_SUPPLY_PROP_TIME_TO_EMPTY_NOW; +- props[nprops++] = POWER_SUPPLY_PROP_TIME_TO_FULL_NOW; +- if (apple_smc_key_exists(smc, SMC_KEY(BITV))) +- props[nprops++] = POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN; +- props[nprops++] = POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN; +- props[nprops++] = POWER_SUPPLY_PROP_VOLTAGE_MIN; +- props[nprops++] = POWER_SUPPLY_PROP_VOLTAGE_MAX; +- if (apple_smc_key_exists(smc, SMC_KEY(B0RC))) +- props[nprops++] = POWER_SUPPLY_PROP_CHARGE_TERM_CURRENT; +- if (apple_smc_key_exists(smc, SMC_KEY(B0RI))) +- props[nprops++] = POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX; +- if (apple_smc_key_exists(smc, SMC_KEY(B0RV))) +- props[nprops++] = POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE; +- props[nprops++] = POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN; +- props[nprops++] = POWER_SUPPLY_PROP_CHARGE_FULL; +- props[nprops++] = POWER_SUPPLY_PROP_CHARGE_NOW; +- props[nprops++] = POWER_SUPPLY_PROP_ENERGY_FULL_DESIGN; +- props[nprops++] = POWER_SUPPLY_PROP_ENERGY_FULL; +- props[nprops++] = POWER_SUPPLY_PROP_ENERGY_NOW; +- props[nprops++] = POWER_SUPPLY_PROP_CHARGE_COUNTER; ++ nprops = macsmc_battery_optional_properties(power, props, nprops); + + /* Detect features based on key availability */ + if (apple_smc_key_exists(smc, SMC_KEY(CHTE))) diff --git a/mseries/aurora/unified72/patches/0008-egpu-config.patch b/mseries/aurora/unified72/patches/0008-egpu-config.patch new file mode 100644 index 000000000..ee3dfdfea --- /dev/null +++ b/mseries/aurora/unified72/patches/0008-egpu-config.patch @@ -0,0 +1,49 @@ +From d10d360a96f406f3b953eceb6e44e7be3f4c7c24 Mon Sep 17 00:00:00 2001 +From: Joshua Warren <816217+joshuaswarren@users.noreply.github.com> +Date: Thu, 15 Oct 2026 09:27:42 -0500 +Subject: [PATCH 2/2] config: build the AMD and Nouveau GPU drivers as modules + +Set CONFIG_DRM_AMDGPU=m and CONFIG_DRM_NOUVEAU=m in the Aurora config +fragment, next to the udmabuf lines of this branch. + +Why: PCIe over Thunderbolt already enumerates devices on these laptops, but +the running kernel has no driver for a discrete GPU. DRM_AMDGPU and +DRM_NOUVEAU are off, and the DRM helpers amdgpu needs (TTM, buddy, suballoc) +are off too, so an out-of-tree amdgpu module cannot be built against the +shipped kernel either. + +What the resolved configuration does (Kconfig only, nothing built): the +fragment is merged into the running 7.1.12 configuration with and without +the two new lines, then olddefconfig is run on the same tree. Only these +symbols change: DRM_AMDGPU=m, DRM_NOUVEAU=m, and what they pull in or +default: DRM_TTM=m, DRM_TTM_HELPER=m, DRM_BUDDY=m, GPU_BUDDY=y, +DRM_SUBALLOC_HELPER=m, DRM_PANEL_BACKLIGHT_QUIRKS=m, DRM_AMD_DC=y, +DRM_DISPLAY_DP_HELPER=y, DRM_DISPLAY_DSC_HELPER=y, +DRM_DISPLAY_HDCP_HELPER=y, DRM_DISPLAY_HDMI_CEC_NOTIFIER_HELPER=y, +CEC_NOTIFIER=y, the Nouveau sub-options (backlight, CH7006, SIL164, debug +levels), and the "is not set" entries of the new sub-options. The 16K page +size, the Apple GPU, display, PCIe, USB4 and DART symbols are identical. +DRM_AMD_DC_FP does not appear in the resolved configuration, so this is a +compute setup, not display output. DRM_XE stays off (it needs 4K pages), +and HSA_AMD, AMDGPU_SI and AMDGPU_CIK stay off. + +Not done: no build, no boot, no card. Module size and the effect on the +package size are not measured. This only prepares the kernel side; whether a +Thunderbolt-attached card works on these laptops is untested. +--- + arch/arm64/configs/asahi.config | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/arch/arm64/configs/asahi.config b/arch/arm64/configs/asahi.config +index f0030c98cfac40..4d31d675f5553f 100644 +--- a/arch/arm64/configs/asahi.config ++++ b/arch/arm64/configs/asahi.config +@@ -45,6 +45,8 @@ CONFIG_DRM_APPLE_AUDIO=y + CONFIG_DRM_ACCEL=y + CONFIG_DRM_ACCEL_ANE=m + CONFIG_DRM_SIMPLEDRM=y ++CONFIG_DRM_AMDGPU=m ++CONFIG_DRM_NOUVEAU=m + CONFIG_UDMABUF=y + CONFIG_DMABUF_HEAPS=y + CONFIG_DMABUF_HEAPS_SYSTEM=y diff --git a/mseries/aurora/unified72/prepare-j314s-trial.py b/mseries/aurora/unified72/prepare-j314s-trial.py index ad9b74e37..4e43f0fed 100644 --- a/mseries/aurora/unified72/prepare-j314s-trial.py +++ b/mseries/aurora/unified72/prepare-j314s-trial.py @@ -2,8 +2,8 @@ # SPDX-License-Identifier: GPL-3.0-or-later """Prepare the pinned unified72 J314S trial offline; never install, arm or reboot. -The release identity, trial slug and native-build receipt come from series.json, so the -same script prepares wip2 (revision 3) or wip3 (revision 4).""" +The release identity and trial slug come from series.json. Use the newest matching +dated native-build receipt when present; wip2 retains its historical date-only receipt.""" import argparse import gzip import hashlib @@ -23,10 +23,8 @@ NEW = SERIES["kernel_release"]["unified72"] SLUG = NEW.split("elementary-", 1)[1] # e.g. aurora72-wip3 TRIAL_ENTRY = f"elementary-{SLUG}-trial" -# The audited-build receipt is named for the trial (wip3 onward); wip2 kept the date-only name. -NATIVE_RECEIPT = next((path for path in (HERE / f"native-build-{SLUG.split('-')[1]}-2026-10-21.json", - HERE / "native-build-2026-10-21.json") if path.exists()), - HERE / f"native-build-{SLUG.split('-')[1]}-2026-10-21.json") +RECEIPTS = sorted(HERE.glob(f"native-build-{SLUG.split('-')[1]}-*.json")) +NATIVE_RECEIPT = RECEIPTS[-1] if RECEIPTS else HERE / "native-build-2026-10-21.json" BASE_SHA = "06a885396f5613154b2fbb6774744efde95a9d25512698d297b3f14da0d4f3aa" BOOT_SHA = "9c9c2d01c3bdb2784daf99cecd6f0e2327eb8f148ea43c8e522e5bae09a14d5f" TRANSITIONS = { diff --git a/mseries/aurora/unified72/review-wip4-2026-10-22.json b/mseries/aurora/unified72/review-wip4-2026-10-22.json new file mode 100644 index 000000000..65be94c0d --- /dev/null +++ b/mseries/aurora/unified72/review-wip4-2026-10-22.json @@ -0,0 +1,212 @@ +{ + "schema": 2, + "reviewed_on": "2026-10-22", + "owner_target": "J314S / M1 Pro / elementary OS on Asahi / Dell WD22TB4 HDMI", + "source": "bd526b3c11ccf8e91d6240261beb3219d8f17f03", + "previous_source": "bd526b3c11ccf8e91d6240261beb3219d8f17f03", + "upstream_pr": "https://github.com/omacom/linux-aurora/pull/158", + "upstream_status": { + "158": { + "state": "OPEN", + "head": "bd526b3c11ccf8e91d6240261beb3219d8f17f03", + "base": "integration/aurora" + }, + "157": { + "state": "OPEN", + "head": "9d3aeb24cb864d5f99a7172e9004884bf3c1a9a0", + "base": "integration/aurora" + }, + "135": { + "state": "OPEN", + "head": "46b5a0981c4955cf33b7275c4001d820791b9f08" + }, + "134": { + "state": "OPEN", + "head": "06d77374e80cb1901fb2c283362abb242cd68c18" + }, + "119": { + "state": "OPEN", + "head": "4cf3221edd6befc79489ff4e2636e0b01e002ac7" + }, + "67": { + "state": "OPEN_DRAFT", + "egpu_head": "d10d360a96f406f3b953eceb6e44e7be3f4c7c24" + }, + "checked_at": "2026-10-22" + }, + "patches": [ + { + "file": "0001-drm-apple-srgb-external-display-colour.patch", + "sha256": "9cd617e413c69006349e8ffa914ee0c16d1d7ba246d5afd9e1031aafbbf09573", + "upstream": "https://github.com/omacom/linux-aurora/pull/157", + "head": "9d3aeb24cb864d5f99a7172e9004884bf3c1a9a0", + "profile": "candidate", + "note": "drm/apple: sRGB surfaces and an sRGB link colorimetry for external displays (unmerged upstream PR #157, 5 files, +73/-6). Applies to the #158 head with small offsets; must be re-checked if #158 moves." + }, + { + "file": "0002-drm-apple-free-dp-tunnel-route-from-silent-dcpext.patch", + "sha256": "fdd6f9cd13ca90b4500130d289182eb69728e25afe5a5ed3f0c92571aa54fd1a", + "upstream": null, + "head": null, + "profile": "candidate", + "note": "drm/apple: local, not upstream. A DCP whose DPTX RemotePort times out is passed over for 300 s, and a timed-out release no longer pins the port's DP tunnel route to it. Applies after 0001 to the #158 source (checked against the exact files; full-tree apply is checked by candidate.py prepare and CI). Never built or booted." + }, + { + "file": "0003-udmabuf.patch", + "sha256": "980e441601ce890741a2bf9c741556e299e5c1ac8f05000991f333fcacbacc6e", + "upstream": "https://github.com/omacom/linux-aurora/pull/67", + "head": "6984b8c07e84b0cf528243db1838dade971ff513", + "profile": "candidate", + "note": "Unmodified upstream config patch; full recipe config is also checked by the build gate." + }, + { + "file": "0004-m3-thermal-fallback.patch", + "sha256": "acbb4af3e55004c3695b673b2e324e3af3e0db6d58bf2f4be7a939ee3b3a515c", + "upstream": "https://github.com/omacom/linux-aurora/pull/135", + "head": "46b5a0981c4955cf33b7275c4001d820791b9f08", + "profile": "candidate", + "note": "Local 7.2.11 port of PR #135 policy/tests. Dormant: this source has a compile-only M3 backend and refuses runtime startup; no thermal behavior is enabled." + }, + { + "file": "0005-j613-camera-147.patch", + "sha256": "5d868e19e9b0edbac4ce19d4954558f471800925937347bc902bd362a706ede0", + "upstream": "https://github.com/omacom/linux-aurora/pull/134", + "head": "06d77374e80cb1901fb2c283362abb242cd68c18", + "profile": "candidate", + "note": "Unmodified PR #134 patch; applies only to matching J613/T8122 firmware. Not relevant to the owner\u2019s J314S." + }, + { + "file": "0006-t8122-camera-2662.patch", + "sha256": "d8938f63279a913640d7af6abf00932298828f8968eba8c97e1ed311d9e7e310", + "upstream": "https://github.com/omacom/linux-aurora/pull/119", + "head": "4cf3221edd6befc79489ff4e2636e0b01e002ac7", + "profile": "candidate", + "note": "Unmodified PR #119 patch; requires matching m1n1 ISP-heap support and compatible device firmware. Not qualified on the owner\u2019s J314S." + }, + { + "file": "0007-macsmc-optional-properties.patch", + "sha256": "5b4f9ba92b99bf388be2c8a3ed11a8fb6caa760632e363aba3e53e5a6a66e5fe", + "upstream": "https://github.com/omacom/linux-aurora/commit/4676c48ecf1b1acaba7c442d33fe9aae0f037e77", + "head": "4676c48ecf1b1acaba7c442d33fe9aae0f037e77", + "profile": "candidate", + "note": "Upstream optional-property change, rebased for 7.2.11; retains charge and critical-battery behavior. Hardware telemetry remains unqualified here." + } + ], + "patch_application": { + "normal_profile": "candidate.py prepare --profile unified72; seven selected patches applied in manifest order without fuzz", + "egpu_profile": "candidate.py prepare --profile unified72-egpu; all eight patches applied in manifest order without fuzz", + "standard_patch_count": 7, + "egpu_patch_count": 8, + "wip4_srgb_and_dcp_changes_retained": true + }, + "configuration": { + "unified72": { + "DRM_AMDGPU": "n", + "DRM_NOUVEAU": "n", + "UDMABUF": "y", + "DMABUF_HEAPS": "y", + "DMABUF_HEAPS_SYSTEM": "y" + }, + "unified72-egpu": { + "DRM_AMDGPU": "m", + "DRM_NOUVEAU": "m", + "package": "linux-image-elementary-aurora72-wip4-egpu", + "kernel_release": "7.2.11-elementary-aurora72-wip4-egpu" + } + }, + "production_host_tests": { + "pmp_bootargs": 9, + "pmp_power": 3, + "m3_runtime_and_thermal_policy": 20, + "total": 32, + "normal_profile": "passed", + "egpu_profile": "passed", + "macsmc_discovery": "passed: all-readable plus 65 per-key failure cases under ASan/UBSan for both profiles" + }, + "owner_relevance": { + "direct": [ + "#157 external-display color handling", + "local wip4 DCP timeout/tunnel-route recovery" + ], + "generic_conditional": [ + "udmabuf/system heap configuration", + "optional SMC gauge-property discovery" + ], + "not_this_machine": [ + "M3/T8122 thermal fallback", + "J613/T8122 camera firmware patches", + "optional eGPU modules" + ], + "thermal_runtime": "Dormant helper only; pinned source M3 backend refuses startup.", + "eGPU": "Only enabled in separately named unified72-egpu profile; hardware unqualified." + }, + "not_rerun": [ + "KUnit execution of the DCP fabric timeout test", + "J314S wip4 boot or WD22TB4 first-plug/retry/recovery test", + "matching-device camera, SMC telemetry or eGPU hardware qualification", + "suspend/resume, rollback boot, and 64-fix semantic parity" + ], + "known_interactions": [ + "#158 and #157 remain unmerged upstream proposals and must be re-pinned if their heads move.", + "The local DCP patch treats a timed-out release as complete; a slow-but-live endpoint remains the principal risk. A tunnel already assigned to the silent pipeline is not moved in that same plug.", + "PR #135 thermal behavior is not wired to the #158 M3 runtime because runtime startup is intentionally refused.", + "PR #119 camera support requires matching m1n1 ISP-heap changes and device firmware; the camera ports do not qualify J314S.", + "The eGPU profile is a separate package identity, with no claim of card, display-output, BAR or compute operation." + ], + "archive_verification": { + "sha256": "881d5a061efa212ed28489311cc97ab6d9bf52891a6c7a00b18f0bbaff131957", + "bytes": 270217582, + "method": "pinned-archive-sha256", + "source_tree_sha256": "50e843dd4d99d3c0381959c23bae34a376108acee8f251c9748c13dfff7c93e9", + "archive_root": "linux-aurora-bd526b3c11ccf8e91d6240261beb3219d8f17f03", + "git_commit": "bd526b3c11ccf8e91d6240261beb3219d8f17f03", + "git_tree_sha1": "a305f231d9137847c7f0ececca98e214cc30e792" + }, + "build_evidence": { + "workflow_run": "https://github.com/techmore/ElementaryOS_MSeries/actions/runs/39854228647", + "commit": "6588da01", + "started_at": "2026-10-22T21:04:22Z", + "completed_at": "2026-10-22T21:48:30Z", + "conclusion": "success", + "jobs": { + "candidate": { + "job_id": 120088108657, + "conclusion": "success", + "duration": "39m29s" + }, + "unified72": { + "job_id": 120088108693, + "conclusion": "success", + "duration": "40m50s" + }, + "unified72-egpu": { + "job_id": 120088108282, + "conclusion": "success", + "duration": "44m03s" + } + }, + "package_inspection": "passed in each build job; artifacts contain payload-only packages, source, provenance and checksums", + "artifacts": [ + { + "name": "elementary-aurora-enhancements-candidate-39854228647", + "size_in_bytes": 308074425, + "sha256": "0fcfc2847fadd1ed1baa33a50c3b352459939ebdfc5ee159f1928f25c2930295" + }, + { + "name": "elementary-aurora-enhancements-unified72-39854228647", + "size_in_bytes": 311760182, + "sha256": "e0f18bd6e5e98ebab39d67eeba42335dce2a34b99bc13638fe8664985afd6740" + }, + { + "name": "elementary-aurora-enhancements-unified72-egpu-39854228647", + "size_in_bytes": 316136851, + "sha256": "816ba3b599f41a8ec24052293201073cd41b962fbacef20707c61fd09020581a" + } + ], + "pull_request_checks": { + "passed": 19, + "skipped": 2, + "failed": 0 + } + } +} diff --git a/mseries/aurora/unified72/series.json b/mseries/aurora/unified72/series.json index 3a8fda644..b2ffa4589 100644 --- a/mseries/aurora/unified72/series.json +++ b/mseries/aurora/unified72/series.json @@ -1,10 +1,12 @@ { "schema": 1, "base_source": "c46d7dcdb8712ea9aeb0ce47b439ffae76371e55", - "revision": 4, + "revision": 6, "source": { "repository": "aurora-silicon/linux", "commit": "bd526b3c11ccf8e91d6240261beb3219d8f17f03", + "git_url": "https://github.com/omacom/linux-aurora.git", + "git_tree_sha1": "a305f231d9137847c7f0ececca98e214cc30e792", "upstream_pr": "https://github.com/omacom/linux-aurora/pull/158", "name": "linux-aurora-bd526b3c11ccf8e91d6240261beb3219d8f17f03.tar.gz", "url": "https://codeload.github.com/omacom/linux-aurora/tar.gz/bd526b3c11ccf8e91d6240261beb3219d8f17f03", @@ -12,10 +14,11 @@ "sha256": "881d5a061efa212ed28489311cc97ab6d9bf52891a6c7a00b18f0bbaff131957" }, "kernel_release": { - "unified72": "7.2.11-elementary-aurora72-wip3" + "unified72": "7.2.11-elementary-aurora72-wip4", + "unified72-egpu": "7.2.11-elementary-aurora72-wip4-egpu" }, - "debian_package": "linux-image-elementary-aurora72-wip3", - "debian_version": "7.2.11+elementary.aurora72.wip3-1", + "debian_package": "linux-image-elementary-aurora72-wip4", + "debian_version": "7.2.11+elementary.aurora72.wip4-1", "patches": [ { "file": "0001-drm-apple-srgb-external-display-colour.patch", @@ -24,6 +27,62 @@ "head": "9d3aeb24cb864d5f99a7172e9004884bf3c1a9a0", "profile": "candidate", "note": "drm/apple: sRGB surfaces and an sRGB link colorimetry for external displays (unmerged upstream PR #157, 5 files, +73/-6). Applies to the #158 head with small offsets; must be re-checked if #158 moves." + }, + { + "file": "0002-drm-apple-free-dp-tunnel-route-from-silent-dcpext.patch", + "sha256": "fdd6f9cd13ca90b4500130d289182eb69728e25afe5a5ed3f0c92571aa54fd1a", + "upstream": null, + "head": null, + "profile": "candidate", + "note": "drm/apple: local, not upstream. A DCP whose DPTX RemotePort times out is passed over for 300 s, and a timed-out release no longer pins the port's DP tunnel route to it. Applies after 0001 to the #158 source (checked against the exact files; full-tree apply is checked by candidate.py prepare and CI). Never built or booted." + }, + { + "file": "0003-udmabuf.patch", + "sha256": "980e441601ce890741a2bf9c741556e299e5c1ac8f05000991f333fcacbacc6e", + "upstream": "https://github.com/omacom/linux-aurora/pull/67", + "head": "6984b8c07e84b0cf528243db1838dade971ff513", + "profile": "candidate", + "note": "Unmodified upstream config patch; full recipe config is also checked by the build gate." + }, + { + "file": "0004-m3-thermal-fallback.patch", + "sha256": "acbb4af3e55004c3695b673b2e324e3af3e0db6d58bf2f4be7a939ee3b3a515c", + "upstream": "https://github.com/omacom/linux-aurora/pull/135", + "head": "46b5a0981c4955cf33b7275c4001d820791b9f08", + "profile": "candidate", + "note": "Local 7.2.11 port of PR #135 policy/tests. Dormant: this source has a compile-only M3 backend and refuses runtime startup; no thermal behavior is enabled." + }, + { + "file": "0005-j613-camera-147.patch", + "sha256": "5d868e19e9b0edbac4ce19d4954558f471800925937347bc902bd362a706ede0", + "upstream": "https://github.com/omacom/linux-aurora/pull/134", + "head": "06d77374e80cb1901fb2c283362abb242cd68c18", + "profile": "candidate", + "note": "Unmodified PR #134 patch; applies only to matching J613/T8122 firmware. Not relevant to the owner\u2019s J314S." + }, + { + "file": "0006-t8122-camera-2662.patch", + "sha256": "d8938f63279a913640d7af6abf00932298828f8968eba8c97e1ed311d9e7e310", + "upstream": "https://github.com/omacom/linux-aurora/pull/119", + "head": "4cf3221edd6befc79489ff4e2636e0b01e002ac7", + "profile": "candidate", + "note": "Unmodified PR #119 patch; requires matching m1n1 ISP-heap support and compatible device firmware. Not qualified on the owner\u2019s J314S." + }, + { + "file": "0007-macsmc-optional-properties.patch", + "sha256": "5b4f9ba92b99bf388be2c8a3ed11a8fb6caa760632e363aba3e53e5a6a66e5fe", + "upstream": "https://github.com/omacom/linux-aurora/commit/4676c48ecf1b1acaba7c442d33fe9aae0f037e77", + "head": "4676c48ecf1b1acaba7c442d33fe9aae0f037e77", + "profile": "candidate", + "note": "Upstream optional-property change, rebased for 7.2.11; retains charge and critical-battery behavior. Hardware telemetry remains unqualified here." + }, + { + "file": "0008-egpu-config.patch", + "sha256": "e9e6ed734d2ffa8f569f8983c24952ccb0ffc3c3f384fa95a2da3d7436610c5b", + "upstream": "https://github.com/omacom/linux-aurora/pull/67", + "head": "d10d360a96f406f3b953eceb6e44e7be3f4c7c24", + "profile": "egpu", + "note": "Unmodified PR #67 module config. Applied only by --profile unified72-egpu; no card, display output, BAR or compute qualification." } ], "config": { @@ -31,13 +90,18 @@ "UDMABUF": "y", "DMABUF_HEAPS": "y", "DMABUF_HEAPS_SYSTEM": "y" + }, + "egpu": { + "DRM_AMDGPU": "m", + "DRM_NOUVEAU": "m" } }, "host_tests": [ "tools/asahi/pmp-bootargs-tests.rs", - "tools/asahi/pmp-power-tests.rs" + "tools/asahi/pmp-power-tests.rs", + "tools/asahi/m3-runtime-tests.rs" ], - "qualification": "Unmerged upstream PR #158 (Asahi 7.2.11 rebase, head bd526b3c) plus unmerged PR #157 as one local patch, pinned as a new build-only candidate. Replaces the wip2 pin (merged #139 source, 7.2.10), which stays on disk and booted as the owner's trial. Source and patch applicability are checked here; native build success, the 64-fix semantic parity (not re-run for 7.2.11), and J314S boot/dock/power/recovery acceptance are NOT established. Preserve shared-DTB fallback compatibility and review upstream M1-family Touch ID regression before hardware use.", + "qualification": "Build only; not booted. All six Aurora20 enhancements were checked against the exact #158 tree and are included in the wip4 source series. Five apply to normal unified72; AMD/Nouveau are opt-in in a separately named eGPU package profile. The M3 thermal safe-cap policy is ported as dormant tested policy code because the #158 M3 backend refuses runtime startup. J613/T8122 camera patches remain firmware/m1n1 scoped. ARM64 candidate, unified72 and unified72-egpu kernel/module/DTB builds plus package inspection passed in run 39854228647. DCP KUnit, J314S boot, dock/recovery, and eGPU/camera hardware qualification remain open.", "superseded_patches": [ { "file": "0001-stock-bindgen-layout-policy.patch", @@ -48,5 +112,11 @@ "note": "Historical local port for wip1; corresponding stock-bindgen default and BINDGEN_LAYOUT_TESTS opt-in are now carried in merged upstream source. Retained for provenance; not applied to wip2." } ], - "review_receipt": "review-wip3-2026-10-21.json" + "review_receipt": "review-wip4-2026-10-22.json", + "debian_packages": { + "unified72-egpu": "linux-image-elementary-aurora72-wip4-egpu" + }, + "debian_versions": { + "unified72-egpu": "7.2.11+elementary.aurora72.wip4.egpu-1" + } } diff --git a/mseries/aurora/unified72/upstream-review-2026-10-26.md b/mseries/aurora/unified72/upstream-review-2026-10-26.md new file mode 100644 index 000000000..5651c4343 --- /dev/null +++ b/mseries/aurora/unified72/upstream-review-2026-10-26.md @@ -0,0 +1,21 @@ +# Aurora display and USB-C upstream scan — 2026-10-26 + +## Scope + +Read the current `omacom/linux-aurora` open pull request index and the primary diffs/status for the display, Type-C, USB4, and J314S-relevant candidates. The candidate source is the exact WIP4 source archive pinned at `bd526b3c11ccf8e91d6240261beb3219d8f17f03`, plus the local DCP timeout recovery patch `0002-drm-apple-free-dp-tunnel-route-from-silent-dcpext.patch`. This was a source review; no upstream code was imported, no build or hardware test was run, and no upstream message was sent. + +## Findings + +- **[#186](https://github.com/omacom/linux-aurora/pull/186), head `2a37f6f206456462970b3bbb3bf9bf8bd8944acd`, open:** reserves Type-C display pipelines until HPD and permits takeover of a pipeline held by a direct DP-Alt port without HPD. It edits `drivers/gpu/drm/apple/dcp-fabric.c`, the same routing function area changed by WIP4 patch 0002. Its purpose is plausible for port allocation, but it does not handle the observed DPTX `RemotePort` training timeout. Keep excluded until a source-level interaction review/rebase or upstream merge. +- **[#163](https://github.com/omacom/linux-aurora/pull/163), head `b8930ad8c5d319d74f9c284c764b7df29d879881`, open:** treats `-ENOSPC` as an occupied display pipeline so TIPD can preserve dock USB. This is not DPTX training recovery. Its `cd321x_display_taken()` and KUnit changes conflict semantically and textually with #186; upstream discussion says it needs a rebase with #186. Exclude from this WIP4 dock trial. +- **[#9](https://github.com/omacom/linux-aurora/pull/9), head `e707d60d5fdca4e0400a79795af5d26e1f5e2368`, open:** an older, broad USB4 DisplayPort tunneling implementation (+3225/-163 across DRM, Thunderbolt, ATC, Type-C, DTS and host fixtures). The WIP4 source already contains the tunnel/DPTX implementation and J314S route descriptions; #9 is not a small additive recovery fix. Its displayed DTS change is for J316C. Do not import it into the WIP4 pin. +- **[#154](https://github.com/omacom/linux-aurora/pull/154), head `54a14dabb01600453995e0877bb630fa622ede4c`, open:** shares an Apple host link between simultaneous DP tunnels. The current incident is one 1080p display; this does not explain its timeout. +- **[#157](https://github.com/omacom/linux-aurora/pull/157), head `9d3aeb24cb864d5f99a7172e9004884bf3c1a9a0`, open:** sRGB surface/link colorimetry, already included as WIP4 patch 0001. It changes color handling, not hotplug recovery. +- **[#170](https://github.com/omacom/linux-aurora/pull/170), head `4a220a8b8cf1ebf2a3b17da0a90908c03b38617b`, open:** gated J314S CPU context-loss diagnostic. It is unrelated to display routing and is deliberately excluded. +- **[Issue #130](https://github.com/omacom/linux-aurora/issues/130), open:** reports DCP crash/no recovery for direct DP-Alt after display power-on or s2idle on J316S. The SoC family is relevant, but the path and trigger differ from this J314S WD22TB4 USB4 tunnel incident; it reinforces that suspend/wake recovery is not qualified and provides no ready patch to cherry-pick. + +The open index has newer work for M3/M6, J700, audio, and other devices, but no additional J314S tunneled-DPTX timeout fix was identified in this scoped scan. The WIP4 pin remains unchanged. Re-scan before the trial if the upstream candidate heads or integration base move. + +## Decision before testing + +No newly found upstream change is safe to add to this WIP4 candidate without introducing a broader or overlapping subsystem change. Keep the exact staged package and continue with the prepared attended trial only after owner approval. The kernel trial and display-profile watcher are separate: the watcher’s repaired D-Bus `ApplyMonitorsConfig` request has succeeded manually, while automatic unplug/replug/restore behavior has not yet passed a physical cycle.