Closed
Description
Task
Find out which NVPCF branch the unmodified 620 nvidia-powerd (sha256 eb9e0371…) takes when it starts on this laptop. Use one bounded bpftrace start on the 620 boot. The probes only read registers and memory. The traced powerd is not read-only: it makes its normal vendor calls, and these can include requests that set platform values. The trace forces and overrides nothing.
Context
- The GPU clock cap is not fixed. Under sustained FP32 and BF16 GEMM, the reported SM clock settles at about 721-754 MHz with reason 0x400 (GPU diagnostic: run the exact GEMM check with BF16 inputs as well as FP32 #1). This issue does not unlock the GPU. It is one diagnostic step.
- Observed on the 620 driver:
nvidia-powerdexits 0 after about 0.25 s and logs its quit message. Which route it takes is not measured. - In the static code, two conditional routes end in a quit with no worker:
- (a) the NVPCF 3x init returns true, and that factory branch creates no worker;
- (b) 3x and 2x/1x both report not supported.
Which route runs on this laptop is unmeasured. The platform's 3x GET_SUPPORTED query returns0x3f. That closes only the ACPI capability binding. It does not rank (a) over (b).
- A trace design exists, with 11 read-only probes under
bpftrace -c. The review found three corrections before any run:- The "primitive load" result carries no information. The wrapper at
0x1521b0returns 0 whether it calls0x14dc70or skips it because the pointer at+0x17f0is NULL. The binary logs "ObjPrimitiveLinux loaded successfully" on both paths. The probe must read the pointer at0x1521bcinstead. - Exit reporting. bpftrace's exit code is not powerd's. The child's exit code or signal is logged only with
-v. A timeout or-kkill has its own meaning. - Binary pin. The start step must check the binary hash, so the 71 build can never start under the trace.
- The "primitive load" result carries no information. The wrapper at
Status
The design is under review. There is no source and no run yet. The trace needs the 620 boot, which does not happen while other work on the laptop needs the current boot.
Metadata
Metadata
Assignees
Labels
No labels
Activity
seankd3 commentedon Nov 5, 2026
Shape card
Problem. Which NVPCF route the unmodified 620
nvidia-powerdtakes on this laptop is unmeasured. The existing trace design reads a wrapper result that is 0 on both routes it was meant to tell apart.The thing. One bpftrace program,
scripts/powerd620-nvpcf-branch.bt, and one short doc,docs/powerd620-nvpcf-trace.md. The doc holds the run command and the fixed reading rules. The program is the reviewed lab design (11 probes,bpftrace -c, every probe filtered onpid == cpid) with three changes:0x7367cwith one at0x1521bc, which printsreg("r0"). That is the+0x17f0pointer after the load and before thecbz. 0 means the wrapper skipped the call. Nonzero means the call path was chosen. Neither proves an ongoing loop or a working controller.*uptr((uint64 *)($sp + 0x68))and*uptr((uint8 *)($sp + 0x70)). The bpftrace 0.27 docs (Language, Address Spaces) say auto-inference can fail.-kand-v.-kreports probe-read helper errors, which are hidden by default.-vlogs the child's exit code or signal.Side effects. The probes only read registers and memory. The traced powerd is not read-only: it makes its normal vendor calls, and these can include requests that set platform values. The trace forces, overrides and spoofs nothing.
Facts and reads.
Stored:
nsecs, pid, raw values);Computed: the route, by this ordered rule list:
VALID only if all of these hold. Otherwise the result is INCONCLUSIVE.
Child exited with code: 0, notterminated by signal.factory_create_entryis present.Failed to probe_readwarning, no lost events and no attach or parse error.A timeout (124), a
-kkill (137) or a signal-terminated child never counts as a normal exit.Route (a): init
bool=1,factory_3x_true_branch,main_no_worker. The pointer value from change 1 is reported with it.Route (b), fallback to 2x/1x: init
bool=0,factory_3x_false_branchandnvpcf2x_retpresent, with the raw value reported.The 3x query result does not decide the route. Its
has_valueand raw value are reported separately for both routes:has_value=0: the query failed with a status (0x56is not supported);has_value=1: the query succeeded. The init return separately shows whether initialization succeeded.Anything else: INCONCLUSIVE, with the events listed.
quit_entry w0=2is reported but does not decide anything, because 2 is also SIGINT.main_no_workeris the discriminator.Impossible states.
/usr/bin/nvidia-powerdsha256eb9e0371f73667f242e8d4742e17a21a68470e08cdc6438a84c263a4c3b6f4d2and/@nv620before the start, so the 71 build cannot start under the trace.Deletes.
0x7367cprobe.-k 5kills bpftrace only if it is still alive 5 s later, and then powerd gets SIGTERM through PDEATHSIG (bpftrace v0.27.0src/util/proc.cpp).Acceptance (one command, later, on the 620 boot only, separately authorized).
sudo -n timeout -k 5 60 bpftrace -k -v -q -o T-trace.txt -c /usr/bin/nvidia-powerd scripts/powerd620-nvpcf-branch.bt 2> T-stderr.txtThe pins run first. The result is read only by the rule list above. Before merge: static review only. The diff against the lab design must show exactly the three changes, and every probe offset must be an instruction start in the 620 disassembly.
Plan. This issue, one branch from fork
mainf23be84in the existing worktree, created only after this card passes, and one small PR with the.bt, the doc and one README link line. About 800 tokens of code and 600 of docs. No helper and no framework.Package prep plan (offline into
@nv620, no reboot; not run)Root
@nv620has UUIDaa28477c-4598-fd40-8804-6f1fbfb158b2. The reviewed helper is$DC/stage-chroot.sh(sha2567deeadcf…).S="taskset -c 0,1 nice -n19 ionice -c3 sudo -n unshare --mount --propagation private sh $DC/stage-chroot.sh @nv620 aa28477c-4598-fd40-8804-6f1fbfb158b2"The chroot gets a fresh
/run, which hides the live/etc/resolv.conftarget (../run/systemd/resolve/stub-resolv.conf). So the chroot does no network work. The live side downloads and verifies the files, and the chroot installs them offline./@nv71.7deeadcf….nv620-steps/hookcheck.shhash isf9e9b81c….$Pis new, with mode 700./boot, and of theBoot*,Loader*andLimine*efivars.pacman -Qhash and the live sync DB hashes.systemctl is-active nvidia-powerdmust reportinactive.pacman -Sp bpftracemust give exactlybcc-0.37.0-2-aarch64.pkg.tar.xzandbpftrace-0.27.0-2-aarch64.pkg.tar.xz.curl -fLeach package and its.siginto$P. No pacman cache and no-Sw.%SHA256SUM%: bcc6d7ce098…, bpftrace7d779ab8….sudo -n pacman-key --verifymust report a good signature for both.stage-chroot: @nv620 aa28477c-….0-1, 19 andidle.$S sha256sum /var/tmp/nv620/hookcheck.shmust bef9e9b81c….$S sh /var/tmp/nv620/hookcheck.shmust print 11 ×maskedwith rc 0.$S pacman -Q bcc bpftracemust find neither.$S sh -c 'mkdir -p -m 700 /var/tmp/nv620/btpkg && cat > /var/tmp/nv620/btpkg/<name>' < $P/<name>for the 4 files. Then$S sha256summust equal the hashes in$P.$S pacman-key --verifychecks both files against the candidate's own keyring.$S pacman --hookdir /etc/pacman.d/hooks --hookdir /var/tmp/nv620/hookmask -Up --print-format '%n %v' <2 files>must print exactlybcc 0.37.0-2andbpftrace 0.27.0-2. Any dependency line means stop.$S pacman --hookdir /etc/pacman.d/hooks --hookdir /var/tmp/nv620/hookmask --noconfirm -U <2 files>. No-S,-Syor-Syu, no kernel and no other package.pacman -Qshows the two versions.pacman.loginstalls only these two, with norunningline for a masked hook.ldd /usr/bin/bpftracehas nonot found.bpftrace --versionreports v0.27.0. That loads no BPF./etc/fstabroot line still hassubvol=/@nv620.pacman -Q bcc bpftracefinds neither.Rollback (inside
@nv620only):$S pacman --hookdir /etc/pacman.d/hooks --hookdir /var/tmp/nv620/hookmask --noconfirm -R bpftrace bcc.Not done: no reboot, no BPF load or attach, no GPU or CUDA call, no live package, service, ESP or config change, and no powerd start.
The GPU clock goal is not fixed.
seankd3 commentedon Nov 5, 2026
Review record: shape card and package plan
Both passes were fresh Terra (
gpt-6.1-terra) reviews, read-only, run by the root session.Elegance: PASS. The pass accepts:
.btplus doc shape with exactly three changes to the reviewed design;0x1521bc;stage-chroot.shboundary and the offline package plan;Bugs: FAIL, 1 blocking finding. The route rule required
has_value=0for route (b). The 3x query can succeed while the init still fails, and the factory then takes the false branch into 2x. The old rule called that observed fallback INCONCLUSIVE. The package plan had no reported blocker.Response. I edited the card's rule list in place: #3 (comment)
has_valueand raw) is reported separately for both routes, and decides neither. So route (a) no longer requireshas_value=1either.A reviewer said the worktree was absent. The root checked it directly: it exists, it is registered, and it is clean at
3b1c1d7. There is no checkout blocker.Status. This waits for a fresh Terra delta review. There is no branch, no source and no install yet. The no-reboot hold stays. The GPU clock goal is not fixed.
seankd3 commentedon Nov 5, 2026
Review record: card revision of 2026-11-05T23:45:56Z
has_value=1means only that the query succeeded. The init return separately shows whether initialization succeeded.mainf23be84. Then run static checks only and push. The exact-commit Terra reviews come before the PR. There is no install, BPF, powerd or GPU step, and no reboot.seankd3 commentedon Nov 5, 2026
Offline package staging commands (for the root's review; not run)
This is the approved plan as one literal script,
nv620-btpkg-stage.sh(sha25681aea327fc86c8953eca5a4c6dd66ef6e359032cdcf2ed72e69beadeaee1dd3c). Save it and run it withbash <file>on the live@nv71root. Onlybash -nwas run on it.Revision 2 (replaces
8e96d3a2…after the root's review):c()now matches the unchanged helper's real first line,stage-chroot: @nv620 aa28477c-… at /run/stage-nv620. The helper itself is not edited (7deeadcf…).pacman.log. After the install it reads only the new lines.Running 'pacman … -U'line, one transaction start and one transaction end, and exactlyinstalled bcc (0.37.0-2)andinstalled bpftrace (0.27.0-2)with no other package change. There must be norunningline for a masked hook.Unchanged from the reviewed plan:
stage-chroot.shwith root@nv620, UUIDaa28477c-4598-fd40-8804-6f1fbfb158b2,taskset -c 0,1, nice 19 and idle IO.bccandbpftraceare each checked as absent, one at a time.hookcheck.shmust print 11maskedlines.-Upmust list exactly the two packages, then one offlinepacman -Uruns with the hook masks.@nv620only:$S pacman --hookdir /etc/pacman.d/hooks --hookdir /var/tmp/nv620/hookmask --noconfirm -R bpftrace bcc.No reboot, mount, BPF attach, powerd start or GPU call has happened. The GPU clock goal is not fixed.
Make the NVPCF trace run block executable and fail closed
Resolve the NVPCF trace program path before the run directory change
seankd3 commentedon Nov 6, 2026
Staging result and compile-only command (for the root to run; not run)
Staging, verified from the raw files (
runs/nv620-btpkg-1105-180828, script81aea327…, one execution):install rc=0. Before the install,bccandbpftracewere each checked absent. After the install,pacman -Qshows exactlybcc 0.37.0-2andbpftrace 0.27.0-2.68B3537F…, trustfull). There are 11maskedlines, andlddhas nothingnot found.bpftrace --versionreportsv0.27.0-872e7a56a, the tag commit.pacman.loglines for this transaction are exactly the-Uline, a start, twoinstalledlines and a completion. The only hook was35-systemd-update, which is not masked.nvidia-powerdinactive) is identical before and after.Compile-only command (sha256
2db69f17ea66174cc5c522076f7c0bae0b47f5c1f4f12ea5d90085a64a0b0bc9; onlybash -nwas run on it):What runs: the unchanged helper (
7deeadcf…) enters@nv620(identity linestage-chroot: @nv620 aa28477c-… at /run/stage-nv620). Inside the chroot, the command pins/usr/bin/nvidia-powerdto the 620 binaryeb9e0371…and exits 90 if it does not match. Then it runsbpftrace --mode=codegen -k -c /bin/true -.Input: the reviewed program, sha256
812e5a86…at623995d, comes in on stdin (-). There is no other copy of the source.Evidence:
D-codegen.out,D-codegen.errandD-codegen-rc.txtgo into the existing private staging run directory. The command refuses to overwrite them. The exit code and stderr are kept when they are nonzero.Why this does not attach or start a target (bpftrace v0.27.0 source, commit
872e7a56):src/main.cpp1032–1040:-cclones the child before compilation.src/util/proc.cppchildfn: the clone waits for a command beforeexecve.src/bpftrace.cpparound line 489: the onlychild_->run(...)is insideBPFtrace::run, which onlyrun_bpftracereaches (src/run_bpftrace.cppline 236).src/main.cpp1210–1211:if (args.mode == Mode::CODEGEN) return 0;returns before that.So no probe attaches, no NVIDIA target runs, and
/bin/trueis not run either. bpftrace kills the waiting clone when it exits. There is no--dry-run, which attaches.Not claimed: whether bpftrace's feature checks load small BPF programs during compilation. That is not checked.
Exit codes:
sudo -n.Accept only if all of these hold:
D-codegen-rc.txtisrc=0with noIDENTITY FAIL;D-codegen.errholds noERRORline.Report every other stderr line raw, for the root to rule on.
No reboot, trace attach, powerd start or GPU call. The GPU clock goal is not fixed.
seankd3 commentedon Nov 6, 2026
Compile-only attempt 1 result, and attempt 2 command (for the root to run; not run)
Attempt 1 (
2db69f17…, one run,D-*files kept):rc=1. The error wasFailed to open kernel function info: Error reading events from /sys/kernel/tracing/available_events (No such file or directory). Causes, from bpftrace v0.27.0src/symbols/kernel.cpp:KernelInfoImpl::openreadsavailable_eventsbefore it compiles, and a missing file is a hard error.available_filter_functionsis read too. A missing file there only gives a warning.src/tracefs/tracefs.cppuses/sys/kernel/debug/tracingif it exists, else/sys/kernel/tracing.Why not a fresh tracefs mount. In kernel v7.2
fs/tracefs/inode.c,tracefs_get_tree()callstracefs_reconfigure()on every new mount, read-only mounts included. That copies the new mount's options into the one shared tracefs superblock, then runssync_filesystem. The host mount shows default options (rw,nosuid,nodev,noexec,relatime, no uid, gid or mode), so the values would be the same. It would still be a write to host tracefs state.Attempt 2: bind the existing mount read-only, inside the private namespace only.
shopens fd 9 on/sys/kernel/tracing. That is the namespace's own copy of the host tracefs mount.7deeadcf…) enters@nv620.mount --bind -c -o ro /proc/self/fd/9 /sys/kernel/tracingruns, with exit 91 on failure;mountinfoline is recorded as evidence;exec bpftrace --mode=codegen -k -c /bin/true -runs with the reviewed.bt(812e5a86…) on stdin.get_tree, so nothing is written to the superblock. The mount is read-only per mount, so any tracefs write would fail. The bind exists only in the private namespace and goes away when the command exits. No tracing setting is written, nothing attaches, and no NVIDIA process runs.Command (sha256
1f1d2dfdc48edd0eb79a7854b7a072dcbfdcc38dd97b36ba0855d7894d379b2f; outer boundtimeout -k 5 120; evidence in newE-*files in the existing private run directory):Checks done (no root, no tracefs, no bpftrace):
bash -npasses.chrootwas bind-mounted read-only from inside it, with and without-c.mountinfoshowedro, a write failed withRead-only file system, and the source stayed unchanged.sudochanged for the test, ran in a user namespace with a stub helper and a stubbpftrace. It gave:rotracefsmountinfoline;--mode=codegen -k -c /bin/true -and the program on stdin;exec, andrc=0;E-*files present.Exit codes:
sudo -n.Accept only if all of these hold:
E-codegen-rc.txtisrc=0, with noIDENTITY FAILand noTRACEFS NOT RO;E-codegen.errholds noERRORline.Every other stderr line is reported raw. I make no claim about whether bpftrace's feature checks load small BPF programs.
The
D-*files are untouched. No PR until the parser is accepted. The GPU clock goal is not fixed.seankd3 commentedon Nov 6, 2026
Compile-only acceptance: PASS (root, once, no reboot)
/tmp/nv620-bt-codegen-e.shsha2561f1d2dfd…, undertimeout -k 5 120. The live root stayed/@nv71with driver 615.71.09 loaded.E-codegen-rc.txt:rc=0, with noIDENTITY FAILand noTRACEFS NOT RO.E-codegen.out:stage-chroot: @nv620 aa28477c-4598-fd40-8804-6f1fbfb158b2 at /run/stage-nv620, then… / /sys/kernel/tracing ro,nosuid,nodev,noexec,relatime - tracefs tracefs rw. Theroapplies to the bind mount only. The superblock flag showsrwbecause the host's superblock is untouched.E-codegen.err: empty, so there were no errors and no warnings.E-codegen.out3976c5de…E-codegen.erre3b0c442…(empty)E-codegen-rc.txt93ff7811…D-codegen.err0f8b609e…,D-codegen-rc.txt91d957f8….What this proves: bpftrace 0.27.0 parses and compiles the reviewed program (
812e5a86…), resolving its probes against the real 620 binaryeb9e0371…inside@nv620, including theuptr()stack reads. It does not prove which route powerd takes, and it does not fix anything. Codegen mode attaches no probe and runs no target. I make no claim about bpftrace's feature checks.Trace which NVPCF route the 620 nvidia-powerd takes at start (#5)
seankd3 commentedon Nov 6, 2026
PR #5 merged; next runtime requirement; GPU-test repoint proposal (not applied)
Merged. PR #5 was squash-merged as
4167ee49623539c58e3adbbf8d1f829c8d243f24(2026-11-06 00:21:08Z) from the reviewed head623995d. The programscripts/powerd620-nvpcf-branch.bthas sha256812e5a86…. This issue stays open, because the route has not been measured on hardware.Next runtime requirement, in order. Each step needs its own authorization, and the reboot needs Sean's go.
apply-block.shonce, and it must printAPPLY PASS.GPU-testand one reboot. Both are blocked by the current no-reboot hold./@nv620, with driver 620.70.06 loaded and theRMSkipACPIBattCap=1key;nvidia-powerdprocess, and its unit inactive;@nv620).REPOpointing at a checkout that holds812e5a86…and with a privateRUNS. Read the result only by the fixed rules. The result is a route at start, not a running controller.default_entry 1, the normal entry.Repoint proposal (lab directory
driver-candidate/boot-menu-nv620-repoint/, mode 700):47713d991922b29d9903b4623e37d0361036442facc6abfe5ec526bb1a26eea6, 5078 B. It is byte-identical to the reviewed nv71 proposal.a13de7a8df51512bddfe1b916e71015920689220d95693bae8b56b588d3713e0, 5081 B. It is built from the current live copy by changing only lines 29, 31 and 32, all inside/GPU test:boot():/EFI/Linux/omarchy_linux-p16-asus-24-nv620.efi#5f356d64…, the b2 of the real file;.cmdline. Exactly 1 of the 25 tokens differs from the live line:rootflags=subvol=@nv71becomes@nv620.default_entry: 1,/Omarchy (normal)with its battcap pin,protocol: efi, the/GPU testlabel (BLI idGPU-test) and the generated/+Omarchygroup.a13de7a8…. That is a check only. Nothing old is restored.omarchy_linux-p16-asus-24-nv620.efihas sha2560d48c2e2…dc19dand b25f356d64…da0f2b, both equal to theout620copy. Its PE.cmdlineequalsout620/p16-nv620.cmdline, and.unameis7.2.8-24-omarchy-p16-asus.Apply block. It uses the same atomic pattern as the executed nv71 apply. The diff against that block shows only names and pins.
limine.conf.pre-nv620-repointandlimine.conf.nv620-repoint-new. Both must not exist yet. The existing.pre-nv620and.pre-nv71are not touched.limine-update, no hooks, no BootOrder, NVRAM or one-shot change.apply-block.shsha2560900b05a118f01668f155beb5d3f32a3dd9e6bb84e4016b7e199a941170c80c7, revision 2 (onlybash -nwas run). It replaces4c232c7f…after the bugs review. The nv71 and battcap recovery image checks moved before any ESP write, so drift or a missing recovery image stops the apply before the backup, staging or replace. The checks are the same 10, only reordered:Recovery is the preserved normal entry. No whole menu is restored. The ESP, the menu and NVRAM were not written. Nothing was rebooted, and no powerd or GPU work ran. The GPU clock goal is not fixed.
seankd3 commentedon Nov 6, 2026
Preparation is complete. PR #5 is merged as 4167ee4, with the reviewed tree unchanged. The trace passed real bpftrace 0.27 code generation inside @nv620 with rc=0 and empty stderr. bcc and bpftrace are installed only in that candidate. The live before/after baseline matched. The later boot-menu proposal also passed fresh BUGS and ELEGANCE reviews at apply-block.sh SHA-256 0900b05a118f01668f155beb5d3f32a3dd9e6bb84e4016b7e199a941170c80c7. It has not been applied. The running root remains @nv71 with loaded driver 615.71.09, and the live menu remains 47713d99. No powerd or bpftrace process remains. Runtime tracing requires a later 620 boot and is pending the existing reboot hold. The GPU cap is unresolved.
seankd3 commentedon Nov 6, 2026
Restart is authorized. Desktop autologin is configured in both roots and the saved Omarchy desktop restores the T3 AppImage. The 620 candidate has the matched driver and trace tools. GPU-test is verified as the next one-shot boot, with the normal entry remaining the permanent default. A single T3 scheduled continuation is bound to this existing thread, due 2026-11-06T02:12:42Z. Source inspection confirms overdue one-time tasks are processed when T3 starts again. The continuation first checks the new boot and matched 620 stack, then runs the reviewed trace once. The encrypted disk still needs its password before Linux starts. This records preparation and authorization, not a GPU fix.
26 remaining items
seankd3 commentedon Nov 7, 2026
Charger telemetry boundary
Read-only UCSI
GET_CAPABILITYthrough the running kernel's debugfs interface returned0x000000000000000001300030012000010000000300004146. Decoding the packedstruct ucsi_capabilitygives attributes0x4146, three connectors, and optional features0x0000. Thus firmware does not advertiseUCSI_CAP_PDO_DETAILS.This explains why the standard Linux source-PDO list is empty:
ucsi_get_pdos()returns without issuingGET_PDOSwhen that feature is absent. The empty list and zero voltage telemetry are not evidence of a low-wattage contract. Sysfs reports an online USB-PD source and current_now=5,000,000 uA, but voltage remains unknown. No negotiated wattage is claimed. No role, PDO, power, or charger setting was changed. Raw command and decode are retained asgpu-cpu-cap-25tex9a0/ucsi-capability.json.The physical adapter/cable identity and prior EC-reset history still need owner input. ASUS documents a full controller reset separately from a normal reboot: https://www.asus.com/us/support/faq/1050239/ . This is a reversible next diagnostic, not a proven GPU fix.
seankd3 commentedon Nov 7, 2026
CPU-only 2 GHz cap: no sustained unlock
Completed
gpu-cpu-cap-25tex9a0with unit exit 0 after 4m11.653s. Only CPU policy maxima changed. PPD and ASUS platform profile stayedperformancein every phase. All 20 maxima read back at 2,000,000 kHz in B, then returned to their original 2,808,000/4,004,000 kHz values.restore_rc=0. All saved maxima still match after completion.All GEMM/sampler exits were 0. All warmup/end correctness checks had zero mismatches among 66 samples. AC remained online. Every recorded NVML status was 0. Maximum GPU temperature was 41 C. Reason 0x400 stayed present.
B fails the declared sustained unlock gate. C did not return to A throughput, so do not attribute that initial drop solely to the CPU limit. The tested CPU limit is not a fix. No claim is made about every possible shared firmware budget. The requested limits are verified through CPUFreq, not independent physical clock measurements.
Cleanup verified: original CPU maxima, performance profile, no profile holds, no test GEMM/sampler/private powerd processes. No installed source, GPU protection, or firmware changed. Raw data and
summary.jsonremain in/home/sean/.floor-poller/gpu-clock/runs/gpu-cpu-cap-25tex9a0.Next discriminating physical check remains the original ASUS adapter/cable and full EC reset history. The current firmware reports no optional UCSI PDO-details support, so Linux cannot settle adapter wattage from its empty PDO list.
seankd3 commentedon Nov 7, 2026
Focused configuration observation
The boot is unchanged (
4ac8cfa6-310b-44ee-8026-7bcc8180235f), so the requested physical controller reset has not occurred. The prior turn completed bounded negative profile/CPU-limit tests.A remaining ambiguity is what the successful NVPCF 3.x startup actually loaded. Static disassembly of the pinned stock 620.70.06 powerd shows five configuration-return call sites at 0x72e4c/0x72eec/0x72f14/0x72f3c/0x72f64. The compiled initialization log at 0x73630..0x73650 obtains its object count from the global map at 0x3275b8+0x28. The configuration object layout has the returned size at +8 and a byte-vector range at +0x10/+0x18/+0x20. The following framework load returns at 0x7367c.
Extend the existing SHA-pinned GDB observer to record these values once during an unmodified normal daemon startup. Read at most 4096 bytes per configuration object, require valid vector bounds, verify every breakpoint instruction against the pinned ELF, and retain normal-exit/cleanup evidence. No branch, register, setting, or installed file is changed. This can distinguish successful wrapper startup from actual populated configuration. It cannot prove a working power controller or fix the GPU.
seankd3 commentedon Nov 7, 2026
NVPCF configuration capture completed
Stock SHA-pinned 620.70.06 powerd loaded six configuration wrapper objects, returned load status 0, returned true from the 3.x initializer, then took the normal no-worker exit. GDB exited 0, stderr was empty, inferior exited 0, and no powerd process remained.
The observed configuration objects contain:
be080f9851faa0257f915be627644d61227c31f9817eb2bdf190a142e2ae94b1.Correction: the first version of this comment incorrectly attributed the 4096-byte slot to a kernel integer-zero response. The constructor disassembly disproves that explanation. The raw trace is unchanged.
The six objects are configuration wrappers, not six power controllers. Successful framework load does not prove populated power-budget primitives or control effectiveness. No new clock measurement or fix claim follows from this trace.
Artifacts:
/home/sean/.floor-poller/gpu-clock/runs/powerd620-config-wkugf4kp. Observer SHA-256fc3b11aa5892f33cb3e7ff13caa9079862f272cd2a9f67b7a39db9323a59e1bd. Trace SHA-256d3416a7f15c393726738bfd372f2a7396e370ad1ea3a3d4ff6a4a1918bff1479. Raw bytes and concise decoded events retained separately.Owner confirmed the original ASUS charger is directly connected and has performed no manual controller reset. Prepare the same-stack measurement after a full physical EC reset. No further daemon startup is needed.
seankd3 commentedon Nov 7, 2026
Abrupt restart during one-shot boot preparation
The prior
sudo bootctl set-oneshot @currentcommand is the final sudo entry in boot4ac8cfa6-310b-44ee-8026-7bcc8180235f. No shutdown sequence was retained. A new boot39b67962-caed-4247-ae98-2f8bfd6b676cis now running the same 7.3.0-26 kernel, @nv620 root, stock 620.70.06 module and battcap key. I will not repeat that EFI-variable operation. Temporal association is established. Firmware causality and a physical controller reset are not established.This boot has no CPUFreq policy entries, no loaded cppc_cpufreq, and PPD exposes only the ASUS platform driver. CPU acpi_cppc metadata still exists. The first measurement job (
gpu-newboot-f22nvzt0) failed in the metadata snapshot because its glob assumed at least one CPU policy. It stopped before any GEMM or NVML sampler launched. Its failed result is retained.The metadata collector now records a zero policy count and does not treat absent CPU policies as a literal path. A separate bounded 180s observation in
gpu-newboot-z4gxukccwill measure the current boot without changing its CPU/GPU settings. This is not a same-CPU-stack comparison or a confirmed EC-reset test. No one-shot boot request or additional reboot is being issued.seankd3 commentedon Nov 7, 2026
Owner now confirms completing the requested physical reset. This means the restart coincided with an attended reset. Do not attribute it to
bootctlfrom temporal ordering alone. No additional boot-selection write is needed.The current 180s measurement is running. Early samples show roughly 2.2 GHz SM, about 61 W NVML GPU power, and roughly 13.5 TFLOP/s event throughput with the unchanged FP32 GEMM. These are early observations, not acceptance or a fix claim. Preserve the current state. If the 180s run passes, measure for at least 15 further minutes because other N1X reports describe delayed fallback after several minutes. The missing CPUFreq policies are a separate changed condition that still needs examination before causal attribution.
seankd3 commentedon Nov 7, 2026
First high-clock sustained result after the attended reset
gpu-newboot-z4gxukcccompleted on boot39b67962-caed-4247-ae98-2f8bfd6b676c, with 7.3.0-26, @nv620, stock 620.70.06 srcversion5B0BEF94704B2BE1D8BB68B, AC online and ASUS performance profile.This proves substantially higher measured GPU performance on this boot. It does not prove indefinite persistence or isolate the reset as the cause: CPUFreq policies and the NVIDIA PPD CPU backend are absent on this boot. Static CPPC metadata remains readable, but feedback counter reads fail. Those differences stay explicit.
A 900s persistence test is now confirmed live as
gpu-reset-sustain-2.service, using the same GEMM and getters. The sampler's only operational change is a 1000s stop ceiling, replacing 340s so it covers the whole test. Whole unit runtime is bounded to 960s. No CPU/GPU setting changes during it. Source/input hashes are verified and raw artifacts go togpu-reset-sustain-h063eda7.An initial launch of the long-test unit exited 1 before hash checking or workload launch. No workload or result directory existed. A separate read-only shell trace then verified all preflight gates, and the traced second unit passed every gate and started the one 900s workload. The first setup failure remains in the journal. Do not count it as a performance test.
seankd3 commentedon Nov 7, 2026
Correction to the persistence test duration: the pinned GEMM clamps its seconds argument with
min(secs, 300). Thus the900request ingpu-reset-sustain-h063eda7completed successfully after about 300s, not 900s. The raw timestamps show this. Both correctness checks passed, all process exits were 0, and GPU clocks remained high through the five-minute run, but it is not 15-minute evidence.Use a private copy with only the argument ceiling and its docstring changed from 300 to 900. Arithmetic, data, CUDA calls, timing windows, and correctness checks remain byte-for-byte unchanged. An isolated AST check verifies that the real argument parser returns 900 for 900 and still caps larger requests at 900, without loading CUDA. The new run retains a diff and input hashes. A separate 900s measurement will establish the actual elapsed workload span. This corrects a measurement setup error, not a GPU fault.
seankd3 commentedon Nov 7, 2026
Concrete CPU-enumeration regression: stale GNVS address in the DSDT override
Read the current firmware DSDT from the original FADT Xdsdt address
0x86f10018, using read-only aligned 32-bit accesses and validating signature, length, and checksum. Ordinary byte-copy reads faulted on this device mapping. The aligned read completed with exit 0.Current firmware DSDT: 74052 bytes, SHA-256
b6a1ef004b71c54878ca6f1dfa13c776a8621b561988df61495c12ae78173c7b, OEM revision 4. Its GNVS OperationRegion points at 0x86f70000.Loaded override: same length, SHA-256
80e0ad4a051704003d09029cb600a9814e1cd370ce774b9749dc09d2232b5aaf, OEM revision 5. It still points at 0x86f50000.The current original firmware DSDT differs from the retained original
0b9ed926...in exactly two bytes: its checksum and the GNVS address byte at AML offset 0x4ee (f5 -> f7). No BIOS version change is needed for this address to move.Read-only first-word checks: old address =
0x02261201; current firmware address =0xffffffff. The loaded DSDT's CPU_STAmethods read C0CE/C0BE/C1CE/C1BE from those four bytes. ACPI currently marks only CPU device instances 00/06/09/0b/0c/10 present. Only those six CPU devices have CPPC metadata, although all 20 CPUs are online through MADT.acpi_cpc_valid()requires descriptors for every online CPU, so missing descriptors explain why CPUFreq cannot initialize.Artifacts:
/home/sean/.floor-poller/gpu-clock/runs/acpi-aligned-read-n6wq55q2, including original table, loaded table, validated address comparison, and the two-byte original-table delta. No firmware or ACPI setting changed during these reads.Do not call the reset a complete fix while this regression exists. Check whether the DSDT override is redundant with the existing
acpi_osi="!Windows 2022"boot option. If so, remove that override and let the firmware supply its current addresses, preserving the independent ASUS SSDT response-buffer correction. This would fix the class of moved firmware-data addresses rather than pinning another physical address.seankd3 commentedon Nov 7, 2026
Actual 15-minute GPU run passed; corrective boot image prepared
gpu-reset-900s-4vuxv6m_completed with 900.640s measured GEMM span. The private benchmark copy changes only its duration ceiling/docstring from 300 to 900. Unit exited 0 after 15m2.351s. Both GEMM and sampler exited 0. Warmup and end each checked 66 values with zero mismatches.All 1795 NVML samples reported AC online and all status codes zero. Maximum sample gap 0.7496s, edge lags 0.1496/0.3497s. Full-run SM min/median/max 1891/2047/2405 MHz. Median event throughput 16,540.75 GFLOP/s. Last-five-minute SM min/median/max 1891/2041/2060 MHz, median event throughput 16,603.4 GFLOP/s. Maximum temperature 73 C. Reason bits 0x400 and 0x4 both occurred. These are normal protected driver settings, with no voltage or protection override.
This passes sustained high GPU performance on the current boot. It does not pass full-system acceptance because the stale DSDT hides CPU ACPI devices.
The actual firmware ASUS SSDT at physical 0x86f60018 is byte-identical to the retained original (SHA-256
46d9ed16af06093cdb849df69646683317d53d7342dfd38f24eab00795d396f0). Its independent response-buffer correction can stay. The DSDT override changes only SSPM's_OSI("Windows 2022")predicate to false, which the existing boot option already does. The running kernel explicitly logsDeleted _OSI(Windows 2022).Prepared a separate UKI by removing only the early
kernel/firmware/acpi/DSDT.amlcpio member. Every remaining initrd member, in order, has identical headers and contents. The ASUS SSDT remains SHA-2569b28ffc14c19f8b7ea2278de88ff9ec070f5f70401107d81fef067a916aa9695. Bytes outside the initrd are identical except validated size/checksum fields. PE section sizes, SizeOfImage, initialized-data size and checksum passed the existing verifier's checks. Kernel, GPU modules, userspace selection and cmdline are unchanged.Candidate:
/boot/EFI/Linux/omarchy_linux-p16-asus-26-fresh-acpi.efi, SHA-256e3931e65abbb3e439f4405bc526dcc311febc63fbcbbb7b5e61944f6a7da5b03. Prepared menu entryOmarchy.linux-p16-asus-26-fresh-acpi. Existing entries and default remain. Full static evidence, source script and original menu backup:/home/sean/.floor-poller/gpu-clock/runs/gpu-fresh-acpi-image-by0c7h13.Not booted. Owner approval for the interrupting reboot is pending. Next verify native DSDT/GNVS, all CPU ACPI devices, all CPUFreq policies, the NVIDIA PPD CPU backend, and sustained GPU performance together. Do not load CPUFreq on the broken ACPI namespace as an attempted fix.
seankd3 commentedon Nov 7, 2026
Prepared the durable source correction as draft PR #19, commit
29c045b894f6ed0f51c1607e3f416c637bda871f. All 49 offline tests pass. The new regression checks reproduce the old behavior against main. The full ACPICA build works with only the machine's original ASUS SSDT, and its output still matches the existing SSDT pin.The first prepared test UKI preserved its member bytes but omitted the 512-byte boundary adjustment after deleting the DSDT entry. A later full
lsinitcpiocheck caught this before boot. That test image has been replaced. The corrected image preserves the compressed main payload byte-for-byte and adds 464 bytes of padding. Both the private copy and installed image pass the complete updated UKI/module verifier, with release/package identity set to the installed 7.3.0-26 kernel.Current candidate:
/boot/EFI/Linux/omarchy_linux-p16-asus-26-fresh-acpi.efi, SHA-256c539c4c7b3b83680f2b6f460e1bf2bb71353c6052682ac106bd04918f5a6356c. Menu entry remainsOmarchy.linux-p16-asus-26-fresh-acpi. Normal default and normal images remain available. New menu SHA-2562b4cf6cb2088ed79434a714e2b5ae157e68f3941d8a046eebb9f1a3e115a86f7. Artifacts:/home/sean/.floor-poller/gpu-clock/runs/gpu-fresh-acpi-aligned-ik5v17mt.Reboot approval is still pending. No one-shot selection or reboot was made. Required next proof remains: a new boot using native firmware DSDT, complete CPU ACPI/CPPC enumeration and CPUFreq controls, followed by sustained high GPU performance. The 900.64-second GPU pass on the current boot does not establish that combined acceptance.
seankd3 commentedon Nov 7, 2026
Read-only follow-up to the new RATED_TDP lead on upstream #1521. Audited the complete published preload and matched command
0x2080206eand its 12-byte parameters against the installed 620 source. It adds GET_CONTROL queries only. No SET_CONTROL or protection change was used.The pinned source blob is
5dda71550c05e537d13d3f4fb2d66f442c1d52ef, source SHA-25620f466d44ef18c54018a71d736a8daf7a59657384feb00f025e98faa2839185f. On the current post-reset boot, RM, WAR, GLOBAL, PROFILE and OS all read action 0 / DEFAULT, with ioctl rc 0 and RM status 0, both at idle and during a 30.120-second cuBLAS workload. A sampler row before and after the loaded query showed 2281 MHz and 96% utilization. All workload telemetry statuses were zero, AC stayed 1, and both 66-element correctness checks had zero mismatches. Workload, sampler and outer service exited 0.This is the fast-state baseline only. We have no corresponding RATED_TDP read from the earlier affected boot, so it does not rule out this arbitration path as the original limiter. It adds a specific read-only comparison to the corrected-image acceptance if low clocks return.
Artifacts:
/home/sean/.floor-poller/gpu-clock/runs/gpu-ratedtdp-read-lutcvw6z. Boot remains39b67962-caed-4247-ae98-2f8bfd6b676c; reboot approval is pending. No further load is running.seankd3 commentedon Nov 7, 2026
Corrected image: 900 s run passed; made default; PR #19 merged
Boot
adcbe679-07d3-41f7-b303-a701e160eade, entryOmarchy.linux-p16-asus-26-fresh-acpi, kernel 7.3.0-26, stock NVIDIA 620.70.06, firmware DSDT OEM revision 4, retained ASUS SSDT9b28ffc1….CPU controls are back. All 20 ACPI CPU devices report status 15 with a physical node. All 20 CPPC directories and 20 CPUFreq policies exist, before and after the run. power-profiles-daemon and the platform profile both read
performance.900 s FP32 cuBLAS run (
gpu-fresh-acpi-accept-89t0okec/measurement900): actual span 900.691 s. 1793 NVML samples cover the span, with a largest gap of 0.645 s. All seven NVML status codes are 0 and AC stayed online. Warmup and end checks found 0 mismatches in 66 sampled outputs each. GEMM and sampler exited 0. SM min/median/max is 1430/2034/2424 MHz. Median throughput is 11,025 GFLOP/s. Maximum GPU temperature is 73 C.Throughput follows the reason state, not the SM clock. The same binary and inputs on both boots:
This boot spent 772 s in the 0x400 state, against 296 s on the previous boot. That is why its full-run median is 33% lower than the previous 16,541 GFLOP/s. Both boots stay far above the old 754 MHz / 2.3 W state. These runs do not show what sets either state, and the sampler did not record memory or other clock domains. No run reached the 3003 MHz maximum that the driver reports.
Persistence (
gpu-fresh-acpi-persist-qaO0qSm0/receipt.json):/etc/initcpio/install/p16-acpi: the DSDTadd_file_earlyline is removed. The SSDT line and all eight allowed kernel versions, including 7.3.0-26, stay. SHA-256 isaa2c2189…before and03d73c74…after. A test initramfs for 7.3.0-26 has the same early archive list as the booted image, with onlykernel/firmware/acpi/SSDT.amlat the pinned SHA-256./boot/limine.conf:default_entry: 1is nowdefault_entry: Omarchy/linux-p16-asus-26-fresh-acpi. Only comments changed otherwise. SHA-256 is2b4cf6cb…before anda308e4b3…after. The image (c539c4c7…) and its BLAKE2b pin are unchanged. The edit ran under the boot-partition lock with pinned hashes.bootctl set-defaultwould not work here. Limine readsLoaderEntryDefaultonly whendefault_entryis not set./boot/limine.conf.pre-fresh-acpi-defaultback to/boot/limine.conf, and reinstall the hook backup atgpu-fresh-acpi-persist-qaO0qSm0/p16-acpi.before. For one boot, pick "Omarchy (normal)" in the menu.Source: PR #19 merged at
492d7e5d(head3809bedf). 48 offline tests pass.Prior art: upstream fixed the same defect in
f3d7778(2026-11-06). Itsdocs/update-safe.mddescribes the frozen DSDT that declares GNVS at0x86f50000, and the same six registered CPU devices (0, 6, 9, 11, 12, 16). Its hook loads only the ASUS SSDT and checks for the kernel'sarch_alloc_acpi_tablessymbol instead of a version list. Because upstream already documents the defect, no new upstream issue was filed.seankd3 commentedon Nov 7, 2026
Closed: the GPU cap is lifted
On AC with a sustained load, the GPU ran at 754 MHz before the fix. It now holds about 2,000 MHz and peaks near 2,500 MHz. That matches the Surface Laptop Ultra, which has the same N1X chip.
The fix:
RMSkipACPIBattCap=1, and the firmware's own DSDT instead of the stale copy (PR #19, merged). That copy kept an old GNVS address, so ACPI exposed only 6 of 20 CPUs. The corrected image is the default boot: kernel 7.3.0-26 with NVIDIA 620.70.06.Evidence: a 900 s FP32 cuBLAS run, comment 6709116632.
What still holds the clock below the 3003 MHz table maximum:
All NVPCF controls read DEFAULT. Sustained 3 GHz is not a goal for this issue.
Cleanup: I removed the
620.70.06nopsrDKMS source. It has noAUTOINSTALLline, and it madedkms autoinstallbuild nothing for new kernels.dkms autoinstall -k 7.3.0-26-omarchy-p16-asusnow returns 0, with only 620.70.06 installed.The
_PSRskip test was inconclusive, and it is not needed now. The upstream thread NVIDIA/open-gpu-kernel-modules#1521 has the data.