BC-250 console image: custom GNOME recipe with remote admin
Build Bazzite BC-250 / Check Bazzite channel digests (push) Has been cancelled
Build Bazzite BC-250 / Build Custom Image (push) Has been cancelled
Build Bazzite BC-250 / Build Custom 40CU Image (push) Has been cancelled
Build Bazzite BC-250 / Save Bazzite channel digest cache (push) Has been cancelled
Build Bazzite BC-250 / Publish GitHub Release (push) Has been cancelled
Build Bazzite BC-250 / Check Bazzite channel digests (push) Has been cancelled
Build Bazzite BC-250 / Build Custom Image (push) Has been cancelled
Build Bazzite BC-250 / Build Custom 40CU Image (push) Has been cancelled
Build Bazzite BC-250 / Save Bazzite channel digest cache (push) Has been cancelled
Build Bazzite BC-250 / Publish GitHub Release (push) Has been cancelled
Based on 62fixolab/Latest-Bazzite-AMD-BC-250-Patched-Images @ 347fd4d. Adds on top of the fork: - recipes/bc250-console-gnome.yml: governor + gnome-remote-desktop + openssh-server, sshd enabled, hhd.service masked, no signing module (local build + ISO path) - files/console/usr/bin/bc250-remote-setup: one-time on-box SSH/RDP setup - files/console/usr/lib/bootc/kargs.d/50-bc250-ttm.toml: ttm memory kargs - BUILD-CONSOLE.md: build -> ISO -> validation instructions files/console/ is separate from files/system/ so the 40-CU unlock tooling stays out of this stable 24-CU image. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
+127
@@ -0,0 +1,127 @@
|
||||
#!/bin/bash
|
||||
# cu_map.sh — Read and display CU bitmap from DRM ioctl via libdrm.
|
||||
#
|
||||
# Optional health overlay:
|
||||
# ./cu_map.sh --health /var/lib/bc250-cu-health-test/results.tsv
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
HEALTH="${BC250_CU_HEALTH_RESULTS:-/var/lib/bc250-cu-health-test/results.tsv}"
|
||||
|
||||
while [ "$#" -gt 0 ]; do
|
||||
case "$1" in
|
||||
--health)
|
||||
HEALTH="${2:?missing value for --health}"
|
||||
shift 2
|
||||
;;
|
||||
--no-health)
|
||||
HEALTH=""
|
||||
shift
|
||||
;;
|
||||
-h|--help)
|
||||
sed -n '1,10p' "$0"
|
||||
exit 0
|
||||
;;
|
||||
*)
|
||||
echo "ERROR: unknown argument: $1" >&2
|
||||
exit 2
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
BC250_CU_HEALTH_RESULTS="$HEALTH" python3 << 'PYEOF'
|
||||
import ctypes, struct, os, sys
|
||||
|
||||
libdrm = ctypes.CDLL("libdrm_amdgpu.so.1")
|
||||
fd = os.open("/dev/dri/renderD128", os.O_RDWR)
|
||||
dev = ctypes.c_void_p()
|
||||
maj, min_ = ctypes.c_uint32(), ctypes.c_uint32()
|
||||
libdrm.amdgpu_device_initialize(fd, ctypes.byref(maj), ctypes.byref(min_), ctypes.byref(dev))
|
||||
|
||||
buf = (ctypes.c_uint8 * 1024)()
|
||||
libdrm.amdgpu_query_info(dev, 0x16, 1024, ctypes.byref(buf))
|
||||
raw = bytes(buf)
|
||||
|
||||
num_se = struct.unpack_from('<I', raw, 20)[0]
|
||||
num_sh = struct.unpack_from('<I', raw, 24)[0]
|
||||
cu_active = struct.unpack_from('<I', raw, 48)[0]
|
||||
|
||||
total = 0
|
||||
rows = []
|
||||
patterns = []
|
||||
for se in range(num_se):
|
||||
for sh in range(num_sh):
|
||||
bm = struct.unpack_from('<I', raw, 56 + (se * 4 + sh) * 4)[0]
|
||||
n = bin(bm).count('1')
|
||||
total += n
|
||||
bar = ''.join('■' if bm & (1 << i) else '□' for i in range(10))
|
||||
# check if disabled CUs are contiguous (all packed at one end)
|
||||
disabled = [i for i in range(10) if not (bm & (1 << i))]
|
||||
if len(disabled) == 0:
|
||||
pattern = "full"
|
||||
elif disabled == list(range(disabled[0], disabled[0] + len(disabled))):
|
||||
pattern = "contiguous"
|
||||
else:
|
||||
pattern = "scattered"
|
||||
rows.append(f"SE{se} SH{sh}: {bar}")
|
||||
patterns.append(pattern)
|
||||
|
||||
possible = num_se * num_sh * 10
|
||||
harvested = possible - total
|
||||
print()
|
||||
health_path = os.environ.get("BC250_CU_HEALTH_RESULTS", "")
|
||||
health = {}
|
||||
if health_path and os.path.exists(health_path):
|
||||
with open(health_path, "r", encoding="utf-8") as f:
|
||||
for line in f:
|
||||
line = line.strip()
|
||||
if not line or line.startswith("#"):
|
||||
continue
|
||||
parts = line.split("\t")
|
||||
if len(parts) < 5:
|
||||
continue
|
||||
_idx, se, sh, wgp, status = parts[:5]
|
||||
try:
|
||||
health[(int(se), int(sh), int(wgp))] = status
|
||||
except ValueError:
|
||||
continue
|
||||
|
||||
print("BC-250 CU Map" + (" + Health" if health else ""))
|
||||
for r in rows:
|
||||
print(r)
|
||||
print(f"{total}/{possible} CUs active, {harvested} harvested")
|
||||
|
||||
if health:
|
||||
usable = 0
|
||||
failed = 0
|
||||
print()
|
||||
print("BC-250 CU Map + Health")
|
||||
for se in range(num_se):
|
||||
for sh in range(num_sh):
|
||||
glyphs = []
|
||||
for cu in range(10):
|
||||
wgp = cu // 2
|
||||
status = health.get((se, sh, wgp))
|
||||
if status == "FAIL":
|
||||
glyphs.append("✗")
|
||||
elif cu < 6:
|
||||
glyphs.append("■")
|
||||
elif status == "PASS":
|
||||
glyphs.append("✓")
|
||||
else:
|
||||
glyphs.append("?")
|
||||
for wgp in range(5):
|
||||
status = health.get((se, sh, wgp))
|
||||
if status == "FAIL":
|
||||
failed += 2
|
||||
elif wgp < 3 or status == "PASS":
|
||||
usable += 2
|
||||
print(f"SE{se} SH{sh}: {''.join(glyphs)}")
|
||||
print(f"{usable}/{possible} CUs usable ({failed} defective, masked)")
|
||||
elif health_path:
|
||||
print()
|
||||
print(f"Health overlay: no results file found at {health_path}")
|
||||
|
||||
libdrm.amdgpu_device_deinitialize(dev)
|
||||
os.close(fd)
|
||||
PYEOF
|
||||
Reference in New Issue
Block a user