code wiki / _hdl_build / _gpu_bm_boot_gate.nx

_gpu_bm_boot_gate.nx source

↩ module page · 91 lines · 7501 B

1// _gpu_bm_boot_gate.nx -- BARE-METAL SOVEREIGN-GPU rung BM-GPU-3: GPU bring-up over the BAR0 MMIO register file. 2// 3// A sovereign driver does the nouveau-style nvkm boot sequence against a spec-faithful BAR0 register MODEL: 4// 1. read NV_PMC_BOOT_0 @0x000000 -> chip id; decode chipset+arch family (Blackwell GB20x ~0x1B0). A read of 5// ALL-1s (0xFFFFFFFF) = the GPU fell off the bus (real nouveau liveness check) -> dead. 6// 2. read NV_PTIMER_TIME_0 @0x009400 twice -> the ns clock must ADVANCE (GPU core clock alive). 7// 3. read VRAM size @0x100000 (PFB) -> 16384 MiB (16 GiB, the 5080; cf. R4b measured ~14.88GiB usable). 8// 4. write NV_PMC_ENABLE @0x000200 (turn engines on) -> read-back latches (engines enabled). 9// NISHI-ECOSYSTEM-ONLY: our model + our driver; the NV register map is the last-mile hardware spec (open-gpu- 10// kernel-modules / nouveau). HONEST SCOPE: bring-up LOGIC vs a spec-faithful model; real MMIO = BM-GPU-6 on native Linux. 11// 12// GREEN iff: BOOT_0 alive + chipset!=0 + arch-family==0x1B0 (Blackwell); PTIMER advances (clock alive); 13// VRAM==16384MiB; PMC_ENABLE write read-back latches; AND tampers (BOOT_0=0xFFFFFFFF off-bus / stuck PTIMER) 14// are correctly detected as dead. 15// Marker -> knowledge/status/gpu_baremetal.log (BMBOOTGATE). license_tier: ORIGINAL 16import "nx_syscalls.nx" 17 18func p(s: *u8) -> i64 { var nn: i64=0; while s[nn]!=(0 as u8){nn=nn+1} sys_write(1,s,nn); return 0 } 19func fp(fd: i64, s: *u8) -> i64 { var nn: i64=0; while s[nn]!=(0 as u8){nn=nn+1} sys_write(fd,s,nn); return 0 } 20func n(v: i64) -> i64 { let bb: *u8=sys_mmap(28); var m: i64=v; if m<0{m=0-m;sys_write(1,"-" as *u8,1)}; let t: *u8=sys_mmap(28); var k: i64=0; if m==0{t[0]=48;k=1}; while m>0{t[k]=(48+(m%10)) as u8;m=m/10;k=k+1}; var i: i64=0; while i<k{bb[i]=t[k-1-i];i=i+1}; sys_write(1,bb,k); return 0 } 21func x(v: i64) -> i64 { p("0x" as *u8); let bb:*u8=sys_mmap(20); var k:i64=0; var m:i64=v; if m==0{bb[0]=48;k=1}; while m>0{ let d:i64=m&15; if d<10{bb[k]=(48+d) as u8}else{bb[k]=(87+d) as u8}; m=(m>>4); k=k+1 } var i:i64=0; let o:*u8=sys_mmap(20); while i<k{o[i]=bb[k-1-i];i=i+1} sys_write(1,o,k); return 0 } 22func fx(fd: i64, v: i64) -> i64 { let bb:*u8=sys_mmap(20); var k:i64=0; var m:i64=v; if m==0{bb[0]=48;k=1}; while m>0{ let d:i64=m&15; if d<10{bb[k]=(48+d) as u8}else{bb[k]=(87+d) as u8}; m=(m>>4); k=k+1 } let o:*u8=sys_mmap(20); var i:i64=0; while i<k{o[i]=bb[k-1-i];i=i+1} fp(fd,"0x" as *u8); sys_write(fd,o,k); return 0 } 23 24// ===== sovereign BAR0 MMIO register MODEL ===== 25// state: [0]=boot0 [1]=ptimer [2]=vram_mb [3]=pmc_enable [4]=alive(1/0) [5]=ptimer_stuck(1/0) 26func bar0_read(st: *i64, off: i64) -> i64 { 27 if off == 0x000000 { if st[4] == 1 { return st[0] } else { return 0xFFFFFFFF } } // NV_PMC_BOOT_0 (off-bus=all-1s) 28 if off == 0x009400 { if st[5] == 0 { st[1] = st[1] + 0x100 } return st[1] } // NV_PTIMER_TIME_0 (advances unless stuck) 29 if off == 0x100000 { return st[2] } // PFB VRAM size (MiB) 30 if off == 0x000200 { return st[3] } // NV_PMC_ENABLE (latched) 31 return 0 32} 33func bar0_write(st: *i64, off: i64, val: i64) -> i64 { if off == 0x000200 { st[3] = val } return 0 } 34 35func make_gpu(st: *i64, alive: i64, stuck: i64) -> i64 { 36 st[0] = 0x1B3000A1 // NV_PMC_BOOT_0: chipset 0x1B3 (Blackwell GB203, bits 20:28), revision 0xA1 37 st[1] = 0; st[2] = 16384; st[3] = 0; st[4] = alive; st[5] = stuck 38 return 0 39} 40 41// the sovereign DRIVER bring-up. out: [alive, chipset, arch_family, clock_alive, vram_mb, engines_on] 42func bring_up(st: *i64, out: *i64) -> i64 { 43 let boot0: i64 = bar0_read(st, 0x000000) 44 var alive: i64 = 1; if boot0 == 0xFFFFFFFF { alive = 0 } if boot0 == 0 { alive = 0 } 45 let chipset: i64 = (boot0 >> 20) & 0x1ff 46 let arch_family: i64 = chipset & 0x1f0 47 let t1: i64 = bar0_read(st, 0x009400); let t2: i64 = bar0_read(st, 0x009400) 48 var clock_alive: i64 = 0; if t2 > t1 { clock_alive = 1 } 49 let vram_mb: i64 = bar0_read(st, 0x100000) 50 bar0_write(st, 0x000200, 0x10001111) // enable GR+FIFO+COPY engines (representative mask) 51 var engines_on: i64 = 0; if bar0_read(st, 0x000200) == 0x10001111 { engines_on = 1 } 52 out[0] = alive; out[1] = chipset; out[2] = arch_family; out[3] = clock_alive; out[4] = vram_mb; out[5] = engines_on 53 return 0 54} 55 56func main() -> i64 { 57 p("=== BARE-METAL SOVEREIGN-GPU BM-GPU-3: BAR0 register bring-up (PMC_BOOT_0 + PTIMER + PFB + PMC_ENABLE) ===\n" as *u8) 58 let st: *i64 = sys_mmap(128); let o: *i64 = sys_mmap(128) 59 make_gpu(st, 1, 0); bring_up(st, o) 60 let alive: i64 = o[0]; let chipset: i64 = o[1]; let arch: i64 = o[2]; let clk: i64 = o[3]; let vram: i64 = o[4]; let eng: i64 = o[5] 61 p(" NV_PMC_BOOT_0 -> alive=" as *u8); n(alive); p(" chipset=" as *u8); x(chipset); p(" arch_family=" as *u8); x(arch); p(" (Blackwell=0x1B0)\n" as *u8) 62 p(" PTIMER advances (clock alive)=" as *u8); n(clk); p(" | VRAM=" as *u8); n(vram); p("MiB (" as *u8); n(vram/1024); p("GiB) | engines_enabled=" as *u8); n(eng); p("\n" as *u8) 63 64 // ---- TAMPERS: dead/off-bus GPU + stuck clock must be detected ---- 65 let st2: *i64 = sys_mmap(128); let o2: *i64 = sys_mmap(128); make_gpu(st2, 0, 0); bring_up(st2, o2) 66 var t_dead: i64 = 0; if o2[0] == 0 { t_dead = 1 } // off-bus (boot0=0xFFFFFFFF) -> alive=0 67 let st3: *i64 = sys_mmap(128); let o3: *i64 = sys_mmap(128); make_gpu(st3, 1, 1); bring_up(st3, o3) 68 var t_stuck: i64 = 0; if o3[3] == 0 { t_stuck = 1 } // stuck PTIMER -> clock_alive=0 69 p(" [tamper] off-bus-detected=" as *u8); n(t_dead); p(" stuck-clock-detected=" as *u8); n(t_stuck); p("\n" as *u8) 70 71 var pass: i64 = 0 72 if alive == 1 { if chipset != 0 { if arch == 0x1B0 { if clk == 1 { if vram == 16384 { if eng == 1 { 73 if t_dead == 1 { if t_stuck == 1 { pass = 1 } } } } } } } } 74 p(" checks: alive=" as *u8); n(alive); p(" blackwell_arch=" as *u8); n(arch==0x1B0); p(" clock_alive=" as *u8); n(clk); p(" vram_16GiB=" as *u8); n(vram==16384); p(" engines_on=" as *u8); n(eng); p(" tampers_ok=" as *u8); var tk: i64=0; if t_dead==1 { if t_stuck==1 { tk=1 } } n(tk); p("\n" as *u8) 75 76 let lfd: i64 = sys_openat_append("knowledge/status/gpu_baremetal.log" as *u8, 0x1a4) 77 if pass == 1 { 78 p("BMBOOTGATE verdict=GREEN reason=sovereign-driver-brings-up-GPU-over-BAR0 (NV_PMC_BOOT_0->Blackwell chipset 0x1B3/arch 0x1B0; PTIMER ns-clock advances=alive; PFB VRAM=16GiB; NV_PMC_ENABLE latches=engines on; off-bus[0xFFFFFFFF]+stuck-clock tampers detected) SCOPE=bringup-LOGIC-vs-spec-model-NOT-real-silicon; real-MMIO=BM-GPU-6\n" as *u8) 79 if lfd >= 0 { 80 fp(lfd, "BMBOOTGATE verdict=GREEN rung=BM-GPU-3-bar0-bringup device=sovereign-NVIDIA-BAR0-model boot0=" as *u8); fx(lfd, st[0]) 81 fp(lfd, " chipset=" as *u8); fx(lfd, chipset); fp(lfd, " arch_family=0x1B0(Blackwell) ptimer=alive vram_mb=" as *u8); fx(lfd, vram) 82 fp(lfd, " pmc_enable=latched tampers=detected(off-bus+stuck-clock) scope=bringup-logic-vs-spec-model-NOT-real-silicon next=BM-GPU-4-channel/RAMFC/USERD; real-MMIO=native-Linux\n" as *u8) 83 sys_close(lfd) 84 } 85 sys_exit(0); return 0 86 } 87 p("BMBOOTGATE verdict=RED (bring-up/identify/tamper not satisfied)\n" as *u8) 88 if lfd >= 0 { fp(lfd, "BMBOOTGATE verdict=RED see-console\n" as *u8); sys_close(lfd) } 89 sys_exit(1) 90 return 1 91}