#!/bin/bash
# skillfish-gtt — how much system RAM the GPU (and the LLM) may use: the GTT.
# Boot-time setting written into the GRUB kernel command line, so it needs a
# reboot. Runs as root (the AI panel calls it through pkexec).
#
# ⚠️ amdgpu.gttsize non si usa piu'. Il kernel 7.x lo dichiara deprecato a ogni
#    avvio ("please use ttm.pages_limit") e, se le due leve indicano numeri
#    diversi, avverte pure che la cosa e' anomala. Il driver decide cosi': se
#    amdgpu.gttsize c'e' ed e' diverso da -1 vince lui, altrimenti il GTT vale
#    ttm.pages_limit pagine. Quindi la leva e' una sola, ed e' espressa in
#    PAGINE da 4 KiB: 1 MB = 256 pagine.
set -euo pipefail
MB="${1:-}"
case "$MB" in (''|*[!0-9]*) echo "usage: skillfish-gtt <megabytes>"; exit 2;; esac

# Il GTT esce dalla RAM di sistema: chiederne piu' di quanta ce n'e' non da'
# memoria in piu', toglie soltanto il tetto che tiene in piedi il sistema.
RAM_MB=$(( $(awk '/^MemTotal:/{print $2}' /proc/meminfo) / 1024 ))
MAX_MB=$(( RAM_MB > 1536 ? RAM_MB - 1024 : 512 ))
if [ "$MB" -lt 512 ] || [ "$MB" -gt "$MAX_MB" ]; then
  echo "refusing GTT=${MB} MB: outside 512..${MAX_MB} MB (total RAM ${RAM_MB} MB)"
  exit 2
fi

G=/etc/default/grub
cp -f "$G" "${G}.skf-gtt.bak"

PAGES=$(( MB * 256 ))

# via il parametro deprecato, dovunque si trovi nella riga
sed -i -E 's/ ?amdgpu\.gttsize=-?[0-9]+//g' "$G"

for key in ttm.pages_limit ttm.page_pool_size; do
  if grep -q "${key}=" "$G"; then
    sed -i -E "s/${key}=[0-9]+/${key}=${PAGES}/" "$G"
  else
    sed -i -E "s/(GRUB_CMDLINE_LINUX_DEFAULT=\")/\1${key}=${PAGES} /" "$G"
  fi
done

# Controprova prima di rigenerare GRUB: quello che volevamo scrivere dev'essere
# li' dentro e il parametro deprecato non deve piu' esserci. Se la riga non e'
# come dovrebbe si rimette quella di prima, perche' una riga di avvio sbagliata
# non da' errore adesso: da' una scheda che non si accende dopo.
if ! grep -q "ttm.pages_limit=${PAGES}" "$G" || grep -q 'amdgpu\.gttsize=' "$G"; then
  echo "kernel command line not as expected, restoring the previous one"
  cp -f "${G}.skf-gtt.bak" "$G"
  exit 1
fi

if command -v update-grub >/dev/null 2>&1; then update-grub; else grub-mkconfig -o /boot/grub/grub.cfg; fi
echo "OK GTT=${MB} MB (ttm.pages_limit=${PAGES} pages) - reboot to apply"
