From 3ca5888000e9fa47df29d058d0cfbc033bbc749e Mon Sep 17 00:00:00 2001 From: Techmore Date: Thu, 22 Oct 2026 07:23:40 -0400 Subject: [PATCH 1/7] Kernel wip4 candidate: free a DP tunnel route pinned to a silent dcpext, plus the 2026-10-22 evidence First wip3 dock plug of a boot routed to dcpext1 (28cc00000), whose DPTX RemotePort never answered validate (six timeouts); the release timed out too, so the port stayed pinned to it and replugging the same port failed until another port was used. Local patch 0002: a DCP whose DPTX call times out is passed over for 300 s, and a timed-out release is completed instead of kept owned. series.json revision 5 (7.2.11-elementary-aurora72-wip4), review receipt, test updates, evidence note, README and handoff entries. Build-only: the patch applies on the pinned files and the routing change ran in userspace; kernel build, KUnit and any boot are not done. Does not move a tunnel already attached to the silent pipeline within the same plug. wip3 stays installed; nothing staged or armed. Co-Authored-By: Claude Sonnet 5.5 --- mseries/OS9-HANDOFF.md | 16 ++ ...026-10-22-j314s-wip3-dcpext1-dptx-wedge.md | 119 ++++++++ mseries/aurora/test_qualification.py | 19 +- mseries/aurora/unified72/README.md | 13 + ...e-dp-tunnel-route-from-silent-dcpext.patch | 257 ++++++++++++++++++ .../unified72/review-wip4-2026-10-22.json | 57 ++++ mseries/aurora/unified72/series.json | 20 +- 7 files changed, 489 insertions(+), 12 deletions(-) create mode 100644 mseries/aurora/hardware-tests/2026-10-22-j314s-wip3-dcpext1-dptx-wedge.md create mode 100644 mseries/aurora/unified72/patches/0002-drm-apple-free-dp-tunnel-route-from-silent-dcpext.patch create mode 100644 mseries/aurora/unified72/review-wip4-2026-10-22.json diff --git a/mseries/OS9-HANDOFF.md b/mseries/OS9-HANDOFF.md index 36c00def1..ecd3625e4 100644 --- a/mseries/OS9-HANDOFF.md +++ b/mseries/OS9-HANDOFF.md @@ -1,3 +1,19 @@ +## 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. + ## Orchard: Machine Lab and Orchard for Incus merged into one app — 2026-10-21 (Claude Code) `mseries/orchard/` is the one app: Machine Lab's window, sidebar, pages and `style.css` with Orchard's name, icon 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_qualification.py b/mseries/aurora/test_qualification.py index 8eb3878e0..6c22ece9b 100644 --- a/mseries/aurora/test_qualification.py +++ b/mseries/aurora/test_qualification.py @@ -224,20 +224,25 @@ 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 reviewed #157 display patch, then one local DPTX-stall patch. 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"]) + for entry in data["patches"]: + self.assertEqual(entry["profile"], "candidate") + 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,6 +250,8 @@ 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"]]) self.assertIn("not_rerun", receipt) self.assertEqual(candidate.settings(data, "unified72")["DRM_AMDGPU"], "n") diff --git a/mseries/aurora/unified72/README.md b/mseries/aurora/unified72/README.md index 090283112..4e545daf4 100644 --- a/mseries/aurora/unified72/README.md +++ b/mseries/aurora/unified72/README.md @@ -1,5 +1,18 @@ # Unified Aurora 7.2.10 build candidate +## wip4 candidate — October 22, 2026 (build-only, not booted) + +**Revision 5 pins `7.2.11-elementary-aurora72-wip4`:** the same #158 source and #157 patch as wip3, plus one local +patch, `patches/0002-drm-apple-free-dp-tunnel-route-from-silent-dcpext.patch`. It answers 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 to it 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. Evidence, the reasoning, and what it does **not** fix (a tunnel already attached to +the silent pipeline is not moved within that plug): +[2026-10-22-j314s-wip3-dcpext1-dptx-wedge.md](../hardware-tests/2026-10-22-j314s-wip3-dcpext1-dptx-wedge.md). +Receipt: [review-wip4-2026-10-22.json](review-wip4-2026-10-22.json). Checked: patch applies on the exact pinned +files; the routing change ran in userspace against the real `dcp-fabric-core.c`. **Not done:** kernel build, KUnit, +any boot. wip3 stays installed and is the running trial kernel; nothing is staged or armed for wip4. + ## wip3 candidate — October 21, 2026 (build-only, not booted) **Revision 4 pins `7.2.11-elementary-aurora72-wip3`:** unmerged upstream 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/review-wip4-2026-10-22.json b/mseries/aurora/unified72/review-wip4-2026-10-22.json new file mode 100644 index 000000000..310cbab48 --- /dev/null +++ b/mseries/aurora/unified72/review-wip4-2026-10-22.json @@ -0,0 +1,57 @@ +{ + "schema": 1, + "reviewed_on": "2026-10-22", + "source": "bd526b3c11ccf8e91d6240261beb3219d8f17f03", + "previous_source": "bd526b3c11ccf8e91d6240261beb3219d8f17f03", + "upstream_pr": "https://github.com/omacom/linux-aurora/pull/158", + "upstream_status": "unchanged from wip3: #158 and #157 still open at review time; this lane adds one local patch only", + "patches": [ + { + "file": "0001-drm-apple-srgb-external-display-colour.patch", + "upstream": "https://github.com/omacom/linux-aurora/pull/157", + "head": "9d3aeb24cb864d5f99a7172e9004884bf3c1a9a0", + "base_of_pr": "44d5afc79da79bb3b17a3ee7494cb8d07a1f1aaa", + "files": [ + "drivers/gpu/drm/apple/dcp-internal.h", + "drivers/gpu/drm/apple/dcp.c", + "drivers/gpu/drm/apple/iomfb_template.c", + "drivers/gpu/drm/apple/parser.c", + "drivers/gpu/drm/apple/plane.c" + ], + "applicability": "patch(1) dry run against the five files at #158 head: clean, offsets +5 (iomfb_template.c) and +89 (plane.c); also clean against integration/aurora faed71028. Full-tree git apply --check runs in candidate.py prepare and in CI." + }, + { + "file": "0002-drm-apple-free-dp-tunnel-route-from-silent-dcpext.patch", + "upstream": null, + "files": [ + "drivers/gpu/drm/apple/dcp-fabric-core.c", + "drivers/gpu/drm/apple/dcp-fabric-core.h", + "drivers/gpu/drm/apple/dcp-fabric-test.c", + "drivers/gpu/drm/apple/dcp-fabric.c", + "drivers/gpu/drm/apple/dcp-internal.h", + "drivers/gpu/drm/apple/dcp.c" + ], + "applicability": "git apply --check passes on a tree holding the pinned #158 versions of the six files with 0001 applied (the six blobs were read from GitHub at bd526b3c, not from a full archive). Full-tree apply runs in candidate.py prepare and CI.", + "evidence": "mseries/aurora/hardware-tests/2026-10-22-j314s-wip3-dcpext1-dptx-wedge.md" + } + ], + "not_rerun": [ + "kernel build (no compile of dcp.c or dcp-fabric.c was possible here; CI decides)", + "KUnit run of fabric_unresponsive_pipeline_test (the same scenario ran as a userspace harness against the real dcp-fabric-core.c with stub headers: passes, and fails when the availability change is removed)", + "64-fix semantic parity", + "host tests listed in series.json against the source", + "any hardware test" + ], + "known_interactions": [ + "#158 changes apple_plane_init() to take both supports_xrgb2101010 and an interchange argument; #157 edits plane.c nearby. The dry run is clean but the build is the real check.", + "#158 does not advertise Interchange framebuffer formats on H17P firmware; not relevant to the J314S.", + "0002 touches dcp.c and dcp-internal.h, which 0001 also edits; the hunks do not overlap but apply order is 0001 then 0002.", + "0002 changes dcp_tb_release_locked(): a timed-out release is now treated as complete. This is the riskiest line; it relies on the firmware being unreachable, not merely slow (the failure seen was six consecutive 1 s timeouts, then every later call timing out)." + ], + "archive_verification": { + "sha256": "881d5a061efa212ed28489311cc97ab6d9bf52891a6c7a00b18f0bbaff131957", + "bytes": 270217582, + "method": "Entire codeload gzip downloaded and hashed locally (trust on first use: the pin is this digest); tar root read from the archive listing; Makefile reads VERSION 7, PATCHLEVEL 2, SUBLEVEL 11.", + "archive_root": "linux-aurora-bd526b3c11ccf8e91d6240261beb3219d8f17f03" + } +} diff --git a/mseries/aurora/unified72/series.json b/mseries/aurora/unified72/series.json index 3a8fda644..65c46db80 100644 --- a/mseries/aurora/unified72/series.json +++ b/mseries/aurora/unified72/series.json @@ -1,7 +1,7 @@ { "schema": 1, "base_source": "c46d7dcdb8712ea9aeb0ce47b439ffae76371e55", - "revision": 4, + "revision": 5, "source": { "repository": "aurora-silicon/linux", "commit": "bd526b3c11ccf8e91d6240261beb3219d8f17f03", @@ -12,10 +12,10 @@ "sha256": "881d5a061efa212ed28489311cc97ab6d9bf52891a6c7a00b18f0bbaff131957" }, "kernel_release": { - "unified72": "7.2.11-elementary-aurora72-wip3" + "unified72": "7.2.11-elementary-aurora72-wip4" }, - "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 +24,14 @@ "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." } ], "config": { @@ -37,7 +45,7 @@ "tools/asahi/pmp-bootargs-tests.rs", "tools/asahi/pmp-power-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": "Same unmerged #158 source (head bd526b3c) and #157 patch as wip3, plus one local patch for the dcpext1 DPTX stall seen on the first wip3 dock plug (2026-10-22). Build-only candidate: patch application is checked on the exact source files and the pure routing logic was exercised in userspace; kernel build, KUnit, J314S boot, dock and recovery are NOT established. Replaces the wip3 pin in this file; wip3 stays installed and is the running trial kernel.", "superseded_patches": [ { "file": "0001-stock-bindgen-layout-policy.patch", @@ -48,5 +56,5 @@ "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" } From 9d3cb336a4a3cd853c8784238182e5e1d3165b21 Mon Sep 17 00:00:00 2001 From: sdolbec Date: Thu, 22 Oct 2026 15:08:35 -0400 Subject: [PATCH 2/7] Fall back to pinned Git tree after codeload limits --- mseries/OS9-HANDOFF.md | 14 +++ mseries/ROADMAP.md | 11 ++ mseries/aurora/candidate.py | 140 ++++++++++++++++++--- mseries/aurora/test_candidate.py | 181 +++++++++++++++++++++++++++ mseries/aurora/unified72/series.json | 2 + 5 files changed, 328 insertions(+), 20 deletions(-) diff --git a/mseries/OS9-HANDOFF.md b/mseries/OS9-HANDOFF.md index 524d72efc..353826d7e 100644 --- a/mseries/OS9-HANDOFF.md +++ b/mseries/OS9-HANDOFF.md @@ -39,6 +39,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 9c1dc93b8..d5e51dfed 100644 --- a/mseries/ROADMAP.md +++ b/mseries/ROADMAP.md @@ -61,6 +61,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/candidate.py b/mseries/aurora/candidate.py index 169e0b714..c8b3f242e 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) @@ -112,29 +217,22 @@ 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" @@ -170,6 +268,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"), diff --git a/mseries/aurora/test_candidate.py b/mseries/aurora/test_candidate.py index c55c768d5..ac74cc983 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 @@ -98,6 +104,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/unified72/series.json b/mseries/aurora/unified72/series.json index 65c46db80..f592310b1 100644 --- a/mseries/aurora/unified72/series.json +++ b/mseries/aurora/unified72/series.json @@ -5,6 +5,8 @@ "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", From 6588da01b34612ead17cb21adfe89aae152195ca Mon Sep 17 00:00:00 2001 From: sdolbec Date: Thu, 22 Oct 2026 17:04:04 -0400 Subject: [PATCH 3/7] Aurora wip4: port Aurora20 enhancement series --- .github/workflows/aurora-enhancements.yml | 4 +- mseries/OS9-HANDOFF.md | 21 +++ mseries/ROADMAP.md | 9 + mseries/aurora/README.md | 4 +- mseries/aurora/candidate.py | 20 +- mseries/aurora/test_candidate.py | 5 + mseries/aurora/test_qualification.py | 13 +- .../AURORA20-PORT-AUDIT-2026-10-22.md | 32 ++++ mseries/aurora/unified72/README.md | 33 ++-- .../unified72/patches/0003-udmabuf.patch | 34 ++++ .../patches/0004-m3-thermal-fallback.patch | 85 +++++++++ .../patches/0005-j613-camera-147.patch | 76 ++++++++ .../patches/0006-t8122-camera-2662.patch | 170 +++++++++++++++++ .../0007-macsmc-optional-properties.patch | 107 +++++++++++ .../unified72/patches/0008-egpu-config.patch | 49 +++++ .../unified72/review-wip4-2026-10-22.json | 173 ++++++++++++++---- mseries/aurora/unified72/series.json | 70 ++++++- 17 files changed, 839 insertions(+), 66 deletions(-) create mode 100644 mseries/aurora/unified72/AURORA20-PORT-AUDIT-2026-10-22.md create mode 100644 mseries/aurora/unified72/patches/0003-udmabuf.patch create mode 100644 mseries/aurora/unified72/patches/0004-m3-thermal-fallback.patch create mode 100644 mseries/aurora/unified72/patches/0005-j613-camera-147.patch create mode 100644 mseries/aurora/unified72/patches/0006-t8122-camera-2662.patch create mode 100644 mseries/aurora/unified72/patches/0007-macsmc-optional-properties.patch create mode 100644 mseries/aurora/unified72/patches/0008-egpu-config.patch diff --git a/.github/workflows/aurora-enhancements.yml b/.github/workflows/aurora-enhancements.yml index a8dd00bfe..0330f0582 100644 --- a/.github/workflows/aurora-enhancements.yml +++ b/.github/workflows/aurora-enhancements.yml @@ -15,7 +15,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: @@ -33,7 +33,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 353826d7e..71fbc770c 100644 --- a/mseries/OS9-HANDOFF.md +++ b/mseries/OS9-HANDOFF.md @@ -1,3 +1,24 @@ +## 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`. +- **Still not built or booted.** ARM64 Image/modules/DTBs and package inspection require CI; DCP KUnit and all 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. Branch/PR publication and CI result are the next gates. + ## 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 diff --git a/mseries/ROADMAP.md b/mseries/ROADMAP.md index d5e51dfed..e449989d3 100644 --- a/mseries/ROADMAP.md +++ b/mseries/ROADMAP.md @@ -1,3 +1,12 @@ +## Aurora 7.2.11 wip4 port set finalized for CI — 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 kernel build, package inspection, DCP KUnit and hardware acceptance remain open. Nothing was installed or staged. + ## Orchard: Machine Lab + Orchard for Incus merged — 2026-10-21 One app in `mseries/orchard/` (Machine Lab's UI, Orchard's name, icon, Incus REST client, Podman page and tests), installed 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 c8b3f242e..57a26b5d8 100644 --- a/mseries/aurora/candidate.py +++ b/mseries/aurora/candidate.py @@ -145,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"): @@ -163,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 @@ -239,7 +239,9 @@ def prepare(cache, output, profile, offline): 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"] @@ -304,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): @@ -351,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") @@ -366,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" @@ -400,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/test_candidate.py b/mseries/aurora/test_candidate.py index ac74cc983..7621eca97 100644 --- a/mseries/aurora/test_candidate.py +++ b/mseries/aurora/test_candidate.py @@ -47,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() diff --git a/mseries/aurora/test_qualification.py b/mseries/aurora/test_qualification.py index 6c22ece9b..f01e3177e 100644 --- a/mseries/aurora/test_qualification.py +++ b/mseries/aurora/test_qualification.py @@ -224,12 +224,16 @@ 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" - # wip4 carries the reviewed #157 display patch, then one local DPTX-stall patch. + # 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", - "0002-drm-apple-free-dp-tunnel-route-from-silent-dcpext.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(entry["profile"], "candidate") self.assertEqual(candidate.sha256(lane / "patches" / entry["file"]), entry["sha256"]) patch = data["patches"][0] self.assertIsNone(data["patches"][1]["upstream"]) @@ -251,9 +255,10 @@ def test_unified72_snapshot_has_separate_identity_and_no_moving_branch_url(self) 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"]]) + [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..7378e5cb6 --- /dev/null +++ b/mseries/aurora/unified72/AURORA20-PORT-AUDIT-2026-10-22.md @@ -0,0 +1,32 @@ +# 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. +- **Still open:** ARM64 kernel build, KUnit for the DCP route logic, 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. diff --git a/mseries/aurora/unified72/README.md b/mseries/aurora/unified72/README.md index 4e545daf4..f18f39fae 100644 --- a/mseries/aurora/unified72/README.md +++ b/mseries/aurora/unified72/README.md @@ -1,17 +1,20 @@ -# Unified Aurora 7.2.10 build candidate +# Unified Aurora 7.2.11 build candidate ## wip4 candidate — October 22, 2026 (build-only, not booted) -**Revision 5 pins `7.2.11-elementary-aurora72-wip4`:** the same #158 source and #157 patch as wip3, plus one local -patch, `patches/0002-drm-apple-free-dp-tunnel-route-from-silent-dcpext.patch`. It answers 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 to it 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. Evidence, the reasoning, and what it does **not** fix (a tunnel already attached to -the silent pipeline is not moved within that plug): -[2026-10-22-j314s-wip3-dcpext1-dptx-wedge.md](../hardware-tests/2026-10-22-j314s-wip3-dcpext1-dptx-wedge.md). -Receipt: [review-wip4-2026-10-22.json](review-wip4-2026-10-22.json). Checked: patch applies on the exact pinned -files; the routing change ran in userspace against the real `dcp-fabric-core.c`. **Not done:** kernel build, KUnit, -any boot. wip3 stays installed and is the running trial kernel; nothing is staged or armed for wip4. +**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 source is prepared and the patch series is checked; no wip4 kernel build, KUnit run or hardware boot is established. +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) @@ -140,14 +143,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/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/review-wip4-2026-10-22.json b/mseries/aurora/unified72/review-wip4-2026-10-22.json index 310cbab48..44d9eb48e 100644 --- a/mseries/aurora/unified72/review-wip4-2026-10-22.json +++ b/mseries/aurora/unified72/review-wip4-2026-10-22.json @@ -1,57 +1,166 @@ { - "schema": 1, + "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": "unchanged from wip3: #158 and #157 still open at review time; this lane adds one local patch only", + "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", - "base_of_pr": "44d5afc79da79bb3b17a3ee7494cb8d07a1f1aaa", - "files": [ - "drivers/gpu/drm/apple/dcp-internal.h", - "drivers/gpu/drm/apple/dcp.c", - "drivers/gpu/drm/apple/iomfb_template.c", - "drivers/gpu/drm/apple/parser.c", - "drivers/gpu/drm/apple/plane.c" - ], - "applicability": "patch(1) dry run against the five files at #158 head: clean, offsets +5 (iomfb_template.c) and +89 (plane.c); also clean against integration/aurora faed71028. Full-tree git apply --check runs in candidate.py prepare and in CI." + "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, - "files": [ - "drivers/gpu/drm/apple/dcp-fabric-core.c", - "drivers/gpu/drm/apple/dcp-fabric-core.h", - "drivers/gpu/drm/apple/dcp-fabric-test.c", - "drivers/gpu/drm/apple/dcp-fabric.c", - "drivers/gpu/drm/apple/dcp-internal.h", - "drivers/gpu/drm/apple/dcp.c" - ], - "applicability": "git apply --check passes on a tree holding the pinned #158 versions of the six files with 0001 applied (the six blobs were read from GitHub at bd526b3c, not from a full archive). Full-tree apply runs in candidate.py prepare and CI.", - "evidence": "mseries/aurora/hardware-tests/2026-10-22-j314s-wip3-dcpext1-dptx-wedge.md" + "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": [ - "kernel build (no compile of dcp.c or dcp-fabric.c was possible here; CI decides)", - "KUnit run of fabric_unresponsive_pipeline_test (the same scenario ran as a userspace harness against the real dcp-fabric-core.c with stub headers: passes, and fails when the availability change is removed)", - "64-fix semantic parity", - "host tests listed in series.json against the source", - "any hardware test" + "native ARM64 kernel/Image/modules/DTB build and package inspection; requires CI", + "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 changes apple_plane_init() to take both supports_xrgb2101010 and an interchange argument; #157 edits plane.c nearby. The dry run is clean but the build is the real check.", - "#158 does not advertise Interchange framebuffer formats on H17P firmware; not relevant to the J314S.", - "0002 touches dcp.c and dcp-internal.h, which 0001 also edits; the hunks do not overlap but apply order is 0001 then 0002.", - "0002 changes dcp_tb_release_locked(): a timed-out release is now treated as complete. This is the riskiest line; it relies on the firmware being unreachable, not merely slow (the failure seen was six consecutive 1 s timeouts, then every later call timing out)." + "#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": "Entire codeload gzip downloaded and hashed locally (trust on first use: the pin is this digest); tar root read from the archive listing; Makefile reads VERSION 7, PATCHLEVEL 2, SUBLEVEL 11.", - "archive_root": "linux-aurora-bd526b3c11ccf8e91d6240261beb3219d8f17f03" + "method": "pinned-archive-sha256", + "source_tree_sha256": "50e843dd4d99d3c0381959c23bae34a376108acee8f251c9748c13dfff7c93e9", + "archive_root": "linux-aurora-bd526b3c11ccf8e91d6240261beb3219d8f17f03", + "git_commit": "bd526b3c11ccf8e91d6240261beb3219d8f17f03", + "git_tree_sha1": "a305f231d9137847c7f0ececca98e214cc30e792" } } diff --git a/mseries/aurora/unified72/series.json b/mseries/aurora/unified72/series.json index f592310b1..d15c598d5 100644 --- a/mseries/aurora/unified72/series.json +++ b/mseries/aurora/unified72/series.json @@ -1,7 +1,7 @@ { "schema": 1, "base_source": "c46d7dcdb8712ea9aeb0ce47b439ffae76371e55", - "revision": 5, + "revision": 6, "source": { "repository": "aurora-silicon/linux", "commit": "bd526b3c11ccf8e91d6240261beb3219d8f17f03", @@ -14,7 +14,8 @@ "sha256": "881d5a061efa212ed28489311cc97ab6d9bf52891a6c7a00b18f0bbaff131957" }, "kernel_release": { - "unified72": "7.2.11-elementary-aurora72-wip4" + "unified72": "7.2.11-elementary-aurora72-wip4", + "unified72-egpu": "7.2.11-elementary-aurora72-wip4-egpu" }, "debian_package": "linux-image-elementary-aurora72-wip4", "debian_version": "7.2.11+elementary.aurora72.wip4-1", @@ -34,6 +35,54 @@ "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": { @@ -41,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": "Same unmerged #158 source (head bd526b3c) and #157 patch as wip3, plus one local patch for the dcpext1 DPTX stall seen on the first wip3 dock plug (2026-10-22). Build-only candidate: patch application is checked on the exact source files and the pure routing logic was exercised in userspace; kernel build, KUnit, J314S boot, dock and recovery are NOT established. Replaces the wip3 pin in this file; wip3 stays installed and is the running trial kernel.", + "qualification": "Build candidate only. 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. No kernel build, KUnit, J314S boot, dock/recovery, or eGPU/camera hardware qualification is established by source preparation.", "superseded_patches": [ { "file": "0001-stock-bindgen-layout-policy.patch", @@ -58,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-wip4-2026-10-22.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" + } } From 9a1a6e5448667e016115909185d8a76e707fbe35 Mon Sep 17 00:00:00 2001 From: sdolbec Date: Thu, 22 Oct 2026 17:50:01 -0400 Subject: [PATCH 4/7] Record wip4 ARM64 build results --- mseries/OS9-HANDOFF.md | 10 ++-- mseries/ROADMAP.md | 6 ++- mseries/aurora/unified72/README.md | 8 ++-- .../unified72/review-wip4-2026-10-22.json | 48 ++++++++++++++++++- mseries/aurora/unified72/series.json | 2 +- 5 files changed, 63 insertions(+), 11 deletions(-) diff --git a/mseries/OS9-HANDOFF.md b/mseries/OS9-HANDOFF.md index 71fbc770c..2ac204691 100644 --- a/mseries/OS9-HANDOFF.md +++ b/mseries/OS9-HANDOFF.md @@ -13,11 +13,13 @@ AMDGPU/Nouveau disabled; `unified72-egpu` is a distinct optional profile/package - 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`. -- **Still not built or booted.** ARM64 Image/modules/DTBs and package inspection require CI; DCP KUnit and all hardware - checks remain open. wip3 stays installed and running, `.20` remains the persistent default, and no boot payload was - staged or armed. +- **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. Branch/PR publication and CI result are the next gates. + 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) diff --git a/mseries/ROADMAP.md b/mseries/ROADMAP.md index e449989d3..9d944b9b2 100644 --- a/mseries/ROADMAP.md +++ b/mseries/ROADMAP.md @@ -1,11 +1,13 @@ -## Aurora 7.2.11 wip4 port set finalized for CI — 2026-10-22 +## 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 kernel build, package inspection, DCP KUnit and hardware acceptance remain open. Nothing was installed or staged. +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). ## Orchard: Machine Lab + Orchard for Incus merged — 2026-10-21 diff --git a/mseries/aurora/unified72/README.md b/mseries/aurora/unified72/README.md index f18f39fae..797d8796b 100644 --- a/mseries/aurora/unified72/README.md +++ b/mseries/aurora/unified72/README.md @@ -1,6 +1,6 @@ # Unified Aurora 7.2.11 build candidate -## wip4 candidate — October 22, 2026 (build-only, not booted) +## 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. @@ -13,8 +13,10 @@ The local DCP patch addresses the first wip3 dock plug of a boot (2026-10-22), w 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 source is prepared and the patch series is checked; no wip4 kernel build, KUnit run or hardware boot is established. -wip3 remains installed and running; nothing is staged or armed for wip4. See [review receipt](review-wip4-2026-10-22.json). +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) diff --git a/mseries/aurora/unified72/review-wip4-2026-10-22.json b/mseries/aurora/unified72/review-wip4-2026-10-22.json index 44d9eb48e..65be94c0d 100644 --- a/mseries/aurora/unified72/review-wip4-2026-10-22.json +++ b/mseries/aurora/unified72/review-wip4-2026-10-22.json @@ -141,7 +141,6 @@ "eGPU": "Only enabled in separately named unified72-egpu profile; hardware unqualified." }, "not_rerun": [ - "native ARM64 kernel/Image/modules/DTB build and package inspection; requires CI", "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", @@ -162,5 +161,52 @@ "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 d15c598d5..b2ffa4589 100644 --- a/mseries/aurora/unified72/series.json +++ b/mseries/aurora/unified72/series.json @@ -101,7 +101,7 @@ "tools/asahi/pmp-power-tests.rs", "tools/asahi/m3-runtime-tests.rs" ], - "qualification": "Build candidate only. 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. No kernel build, KUnit, J314S boot, dock/recovery, or eGPU/camera hardware qualification is established by source preparation.", + "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", From de375f38acdc8fb3bc88ed65982c09f619e1034d Mon Sep 17 00:00:00 2001 From: sdolbec Date: Thu, 22 Oct 2026 17:50:56 -0400 Subject: [PATCH 5/7] Refresh wip4 port audit after CI build --- mseries/aurora/unified72/AURORA20-PORT-AUDIT-2026-10-22.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mseries/aurora/unified72/AURORA20-PORT-AUDIT-2026-10-22.md b/mseries/aurora/unified72/AURORA20-PORT-AUDIT-2026-10-22.md index 7378e5cb6..ad53c57de 100644 --- a/mseries/aurora/unified72/AURORA20-PORT-AUDIT-2026-10-22.md +++ b/mseries/aurora/unified72/AURORA20-PORT-AUDIT-2026-10-22.md @@ -27,6 +27,6 @@ GitHub state was read directly on 2026-10-22: #158 is still open at the pinned s - **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. -- **Still open:** ARM64 kernel build, KUnit for the DCP route logic, 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. +- **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. From ca5045d4491a06aa52894dcc4b88b3a3edde2be3 Mon Sep 17 00:00:00 2001 From: sdolbec Date: Mon, 26 Oct 2026 07:31:07 -0400 Subject: [PATCH 6/7] Prepare offline wip4 dock trial after upstream scan --- mseries/OS9-HANDOFF.md | 25 +++ mseries/ROADMAP.md | 15 ++ .../AURORA20-PORT-AUDIT-2026-10-22.md | 42 ++++ mseries/aurora/unified72/README.md | 16 ++ .../preparation.json | 127 ++++++++++++ .../native-build-wip4-2026-10-23.json | 180 ++++++++++++++++++ .../aurora/unified72/prepare-j314s-trial.py | 10 +- 7 files changed, 409 insertions(+), 6 deletions(-) create mode 100644 mseries/aurora/unified72/boot-preflight-wip4-2026-10-26/preparation.json create mode 100644 mseries/aurora/unified72/native-build-wip4-2026-10-23.json diff --git a/mseries/OS9-HANDOFF.md b/mseries/OS9-HANDOFF.md index db2811a56..795b3877c 100644 --- a/mseries/OS9-HANDOFF.md +++ b/mseries/OS9-HANDOFF.md @@ -1,3 +1,28 @@ +## 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` and unplug/replug behavior are 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 dated audit reviewed +Aurora #186 (direct DP-alt pipeline reservation/takeover) and #163 (TIPD `-ENOSPC` handling). Both remain open and +blocked; they do not directly fix the WD22TB4 tunneled DPTX timeout, and #186 overlaps local patch 0002. Exclude both +from this candidate for now; pinned #158 merged unchanged, while #157 remains open. The source branch is 163 commits +behind moving `integration/aurora`, so do not roll the full branch forward. Details and sources are in +`aurora/unified72/AURORA20-PORT-AUDIT-2026-10-22.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 diff --git a/mseries/ROADMAP.md b/mseries/ROADMAP.md index 0325e2b0e..bc2da2cf5 100644 --- a/mseries/ROADMAP.md +++ b/mseries/ROADMAP.md @@ -1,3 +1,18 @@ +## 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; live profile application and repeated unplug/replug recovery remain unverified. Per owner sequencing, finish +WIP4/upstream preparation before another cable test. Reviewed Aurora #186 (direct DP-alt pipeline reservation/takeover) +and #163 (TIPD `-ENOSPC` handling): both are open/blocked and not direct fixes for this tunneled DPTX timeout; #186 +overlaps WIP4's local DCP patch. Keep them out until focused interaction review or upstream merge. Pinned #158 merged +unchanged; #157 remains open. 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 diff --git a/mseries/aurora/unified72/AURORA20-PORT-AUDIT-2026-10-22.md b/mseries/aurora/unified72/AURORA20-PORT-AUDIT-2026-10-22.md index ad53c57de..de8a14e9a 100644 --- a/mseries/aurora/unified72/AURORA20-PORT-AUDIT-2026-10-22.md +++ b/mseries/aurora/unified72/AURORA20-PORT-AUDIT-2026-10-22.md @@ -30,3 +30,45 @@ GitHub state was read directly on 2026-10-22: #158 is still open at the pinned s - **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 797d8796b..7c8472b36 100644 --- a/mseries/aurora/unified72/README.md +++ b/mseries/aurora/unified72/README.md @@ -1,5 +1,21 @@ # Unified Aurora 7.2.11 build candidate +## wip4 candidate — upstream scan and deployment preparation, October 26, 2026 + +Before any further dock cable test, the upstream scan reviewed Aurora #186 (direct DP-alt pipeline reservation/takeover) +and #163 (TIPD handling when a pipeline is occupied). Both are open and blocked; neither directly fixes the WD22TB4 +tunneled DPTX timeout observed on this J314S, and #186 overlaps the local DCP-fabric timeout patch. They are excluded +from this candidate until a focused rebase/interaction review or an upstream merge. The pinned #158 source commit has +since merged unchanged; #157 remains open. See the [dated source audit](AURORA20-PORT-AUDIT-2026-10-22.md#upstream-displaytype-c-scan-before-j314s-testing--2026-10-26). + +**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 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/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 = { From f68fd1d9833d4895607df1951726b163542c71f0 Mon Sep 17 00:00:00 2001 From: sdolbec Date: Mon, 26 Oct 2026 07:40:01 -0400 Subject: [PATCH 7/7] Refresh Aurora dock upstream review --- mseries/OS9-HANDOFF.md | 11 +++------- mseries/ROADMAP.md | 7 ++----- mseries/aurora/unified72/README.md | 6 +----- .../unified72/upstream-review-2026-10-26.md | 21 +++++++++++++++++++ 4 files changed, 27 insertions(+), 18 deletions(-) create mode 100644 mseries/aurora/unified72/upstream-review-2026-10-26.md diff --git a/mseries/OS9-HANDOFF.md b/mseries/OS9-HANDOFF.md index 795b3877c..7bf55b604 100644 --- a/mseries/OS9-HANDOFF.md +++ b/mseries/OS9-HANDOFF.md @@ -5,14 +5,9 @@ The WD22TB4 picture returned after the owner moved the cable from rear-left to f 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` and unplug/replug behavior are 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 dated audit reviewed -Aurora #186 (direct DP-alt pipeline reservation/takeover) and #163 (TIPD `-ENOSPC` handling). Both remain open and -blocked; they do not directly fix the WD22TB4 tunneled DPTX timeout, and #186 overlaps local patch 0002. Exclude both -from this candidate for now; pinned #158 merged unchanged, while #157 remains open. The source branch is 163 commits -behind moving `integration/aurora`, so do not roll the full branch forward. Details and sources are in -`aurora/unified72/AURORA20-PORT-AUDIT-2026-10-22.md`. +`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 diff --git a/mseries/ROADMAP.md b/mseries/ROADMAP.md index bc2da2cf5..331a82245 100644 --- a/mseries/ROADMAP.md +++ b/mseries/ROADMAP.md @@ -1,11 +1,8 @@ ## 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; live profile application and repeated unplug/replug recovery remain unverified. Per owner sequencing, finish -WIP4/upstream preparation before another cable test. Reviewed Aurora #186 (direct DP-alt pipeline reservation/takeover) -and #163 (TIPD `-ENOSPC` handling): both are open/blocked and not direct fixes for this tunneled DPTX timeout; #186 -overlaps WIP4's local DCP patch. Keep them out until focused interaction review or upstream merge. Pinned #158 merged -unchanged; #157 remains open. Exact ARM64 artifact 39944207967 is now checksum-audited and its private offline trial +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, diff --git a/mseries/aurora/unified72/README.md b/mseries/aurora/unified72/README.md index 7c8472b36..e090d5ae6 100644 --- a/mseries/aurora/unified72/README.md +++ b/mseries/aurora/unified72/README.md @@ -2,11 +2,7 @@ ## wip4 candidate — upstream scan and deployment preparation, October 26, 2026 -Before any further dock cable test, the upstream scan reviewed Aurora #186 (direct DP-alt pipeline reservation/takeover) -and #163 (TIPD handling when a pipeline is occupied). Both are open and blocked; neither directly fixes the WD22TB4 -tunneled DPTX timeout observed on this J314S, and #186 overlaps the local DCP-fabric timeout patch. They are excluded -from this candidate until a focused rebase/interaction review or an upstream merge. The pinned #158 source commit has -since merged unchanged; #157 remains open. See the [dated source audit](AURORA20-PORT-AUDIT-2026-10-22.md#upstream-displaytype-c-scan-before-j314s-testing--2026-10-26). +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 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.