From bb07d4a5d1b679e96f28af719c2c3daadb25cdf5 Mon Sep 17 00:00:00 2001 From: rickpeters Date: Fri, 25 Sep 2026 20:37:47 +0200 Subject: [PATCH] feat: HDMI refresh boost and Update BIOS under Steam Machine support Both are sub-options of Steam Machine support now, shown only while it is ticked. Unticking it unticks them; unticking the kernel pin unticks the HDMI refresh boost, which only works with the pinned kernel. --- AGENTS.md | 7 ++++--- CHANGELOG.md | 4 ++++ README.md | 18 +++++++++--------- lib/menu.sh | 20 ++++++++++++++------ 4 files changed, 31 insertions(+), 18 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index 059de86..683332b 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -142,7 +142,7 @@ gamescope and the Plasma desktop. Primary target: the Valve Steam Machine `steam-set-session plasma.desktop` plus the plasmalogin sync bridge when it exists, at every boot. CachyOS's `cachyos-gamescope-autologin` still sets gamescope during each desktop session; the unit corrects it at boot. -- `bios` is an *action* (`ACTIONS` in `lib/menu.sh`), not an on/off +- `bios` is an *action* (`ACTIONS` in `lib/menu.sh`) and a sub-option of `machine`, not an on/off component: never preselected (not even on a first run), never re-applied by `a`, not listed in the state overview, and `bios_status` is always off. Only selectable when Valve's version differs from the installed one @@ -171,8 +171,9 @@ gamescope and the Plasma desktop. Primary target: the Valve Steam Machine The start script closes its window after a 10-second countdown on success and waits for Enter after an error; it uses `pipefail`, or a failed download would run an empty script and count as success. -- HDMI refresh boost (`hdmi`, `lib/hdmi-refresh.sh`): only on Fremont with - the pinned kernel (stays visible while on). It needs someone at the +- HDMI refresh boost (`hdmi`, `lib/hdmi-refresh.sh`): a sub-option of + `machine` (like `kpin` and `bios`), only on Fremont with the pinned kernel + (stays visible while on); unticking `kpin` unticks it. It needs someone at the screen: the graphical app's backend (`BACKEND=true`) must refuse it, and every step needs a "y" within 15 s (`WIZARD_HDMI_CONFIRM_SECONDS` for scripted tests). debugfs is root-only (glob it under sudo), and `edid_override` takes exactly `reset` with no diff --git a/CHANGELOG.md b/CHANGELOG.md index 41ae0e4..4161285 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,10 @@ one per merged pull request. (rounded down to ten, plus the hundred below as a safe option), tests each step live with a confirmation, and makes the confirmed ones permanent through `drm.edid_firmware` (Limine, sdboot-manage or GRUB). +- **feat: HDMI refresh boost and Update BIOS under Steam Machine support** + - Both are sub-options now, shown only while Steam Machine support is + ticked. Unticking it unticks them; unticking the kernel pin unticks the + HDMI refresh boost. ## 1.1.4 - 2026-09-25 diff --git a/README.md b/README.md index 5d170d9..6180589 100644 --- a/README.md +++ b/README.md @@ -50,15 +50,15 @@ What Steamify can do on a Valve Steam Machine: [release](https://github.com/theupriser/steamify-cachyos/releases/tag/kernel-7.1.6-1), checked against CachyOS's signature ([details](TECHNICAL.md#kernel-pin-steam-machine)). -- **HDMI refresh boost** - only with the pinned kernel, never ticked by - default: gets the highest refresh rate your HDMI display runs at the - desktop resolution (e.g. 110 Hz instead of 60 on a 3440x1440 monitor). - Each step is shown and you confirm it; no answer within 15 s switches - back. For more (e.g. 175 Hz), use DisplayPort - ([details](TECHNICAL.md#hdmi-refresh-boost-steam-machine)). -- **Update BIOS** - installs Valve's newest Steam Machine BIOS. Never ticked - by default, at your own risk, and only after two warnings - ([details](TECHNICAL.md#bios-updates-steam-machine)). + - **HDMI refresh boost** - only with the pinned kernel, never ticked by + default: gets the highest refresh rate your HDMI display runs at the + desktop resolution (e.g. 110 Hz instead of 60 on a 3440x1440 monitor). + Each step is shown and you confirm it; no answer within 15 s switches + back. For more (e.g. 175 Hz), use DisplayPort + ([details](TECHNICAL.md#hdmi-refresh-boost-steam-machine)). + - **Update BIOS** - installs Valve's newest Steam Machine BIOS. Never ticked + by default, at your own risk, and only after two warnings + ([details](TECHNICAL.md#bios-updates-steam-machine)). ## Requirements diff --git a/lib/menu.sh b/lib/menu.sh index cbecec5..6ed5eb4 100644 --- a/lib/menu.sh +++ b/lib/menu.sh @@ -10,7 +10,7 @@ COMPONENTS=(gaming boot theme glyphs single launcher cec machine kpin hdmi bios) # re-applied, not listed as on or off. ACTIONS=(bios) # Sub-options, shown indented under their parent and only while it's ticked. -declare -A PARENT=([boot]=gaming [kpin]=machine) +declare -A PARENT=([boot]=gaming [kpin]=machine [hdmi]=machine [bios]=machine) # Never preselected on a first run: booting into the desktop is a choice, # gamescope is the default; HDMI-CEC is opt-in (it can wake the machine or # upset other devices on the TV, even on SteamOS), except on a Steam Machine, @@ -96,6 +96,12 @@ toggle_component() { # The kernel pin is opt-out: ticked along with Steam Machine support. if [[ "$c" == machine ]]; then WANTED[kpin]=${WANTED[machine]}; fi if [[ "$c" == kpin && "${WANTED[kpin]}" == 1 ]]; then WANTED[machine]=1; fi + # HDMI refresh boost and the BIOS update sit under Steam Machine support; + # the boost also needs the pinned kernel (newer kernels don't need it). + if [[ "$c" == machine && "${WANTED[machine]}" == 0 ]]; then WANTED[hdmi]=0; WANTED[bios]=0; fi + if [[ "$c" == kpin && "${WANTED[kpin]}" == 0 ]]; then WANTED[hdmi]=0; fi + if [[ "$c" == hdmi && "${WANTED[hdmi]}" == 1 ]]; then WANTED[machine]=1; WANTED[kpin]=1; fi + if [[ "$c" == bios && "${WANTED[bios]}" == 1 ]]; then WANTED[machine]=1; fi } show_menu() { @@ -118,12 +124,13 @@ show_menu() { [[ "${CURRENT[gaming]}" == 1 ]] || now="-" want="gaming"; [[ "${WANTED[boot]}" == 1 ]] && want="desk" printf " %-3s %-6s %-6s └ %s\n" "$i" "$now" "$want" "$(boot_choice "${WANTED[boot]}")" + elif ! component_selectable "$c"; then + local tree=""; [[ -n "${PARENT[$c]:-}" ]] && tree=" └ " + printf " %b%-3s %-6s %-6s %s%s (not available)%b\n" "$c_dim" "$i" "$now" "$want" "$tree" "${LABEL[$c]}" "$c_reset" elif [[ -n "${PARENT[$c]:-}" ]]; then printf " %-3s %b %-6s └ %s\n" "$i" "$now" "$want" "${LABEL[$c]}" - elif component_selectable "$c"; then - printf " %-3s %b %-6s %s\n" "$i" "$now" "$want" "${LABEL[$c]}" else - printf " %b%-3s %-6s %-6s %s (not available)%b\n" "$c_dim" "$i" "$now" "$want" "${LABEL[$c]}" "$c_reset" + printf " %-3s %b %-6s %s\n" "$i" "$now" "$want" "${LABEL[$c]}" fi done echo @@ -171,8 +178,9 @@ draw_menu_tui() { fi if ! component_selectable "$c"; then # Greyed out: nothing to do (e.g. BIOS already up to date). - local mark=" "; (( i == cursor )) && mark=" ${c_cyan}>${c_reset} " - echo -e "${mark}${c_dim}[ ] ${LABEL[$c]} (not available)${c_reset}" + local mark=" " tree=""; (( i == cursor )) && mark=" ${c_cyan}>${c_reset} " + [[ -n "${PARENT[$c]:-}" ]] && tree=" └ " + echo -e "${mark}${c_dim}${tree}[ ] ${LABEL[$c]} (not available)${c_reset}" elif (( i == cursor )); then # The green x's reset would end the bold too: re-enable it after. echo -e " ${c_cyan}>${c_reset} ${c_bold}${line//"$c_reset"/"$c_reset$c_bold"}${c_reset}${state}"