ThinkPad T480 com bateria interna e externa

O ThinkPad T480 tem duas baterias — uma interna (BAT0) e uma externa removível (BAT1) — e por padrão o Omarchy vem com power-profiles-daemon (PPD), que não gerencia thresholds de carga. Resultado: ambas carregam até 100% sempre, o que acelera a degradação. No meu T480 a BAT1 já estava em 47% da capacidade original com apenas 226 ciclos — sinal claro de célula estressada por ficar cheia o tempo todo.

A solução para ThinkPad é o tlp, que lê e escreve thresholds via thinkpad_acpi nativo e persiste entre reboots. Desde a versão 1.6 o TLP coexiste com o power-profiles-daemon — basta instalar ao lado e configurar para dividir responsabilidades.

Diagnóstico inicial

Antes de mexer, verifique o estado das baterias:

for b in BAT0 BAT1; do
  echo "=== $b ==="
  cat /sys/class/power_supply/$b/model_name
  echo "design: $(cat /sys/class/power_supply/$b/energy_full_design) µWh"
  echo "atual:  $(cat /sys/class/power_supply/$b/energy_full) µWh"
  echo "start:  $(cat /sys/class/power_supply/$b/charge_control_start_threshold)"
  echo "stop:   $(cat /sys/class/power_supply/$b/charge_control_end_threshold)"
done

Se start for 0 e stop for 100, não há proteção de threshold ativa. A razão entre energy_full / energy_full_design é a saúde real da bateria.

Divisão de responsabilidades

A ideia é ter os dois daemons rodando, cada um com seu domínio:

DomínioResponsável
Thresholds de carga (40/80)TLP
Dual-battery / ordem de descargaTLP (via firmware)
Runtime PM em USB/PCIeTLP
Wi-Fi power save por AC/BATTLP
Menu de perfis (performance / balanced / power-saver)power-profiles-daemon
CPU governor e EPPpower-profiles-daemon

Quando o TLP detecta o PPD rodando, ele desativa automaticamente seus próprios controles de CPU — sem conflito.

Instalação

# Instala TLP e a extensão pro NetworkManager
sudo pacman -S tlp tlp-rdw

# Habilita o servico (o power-profiles-daemon ja vem habilitado no Omarchy)
sudo systemctl enable --now tlp.service

# Desativa servicos que o TLP substitui
sudo systemctl mask systemd-rfkill.service systemd-rfkill.socket

Se você já tinha removido o power-profiles-daemon antes, reinstale:

sudo pacman -S power-profiles-daemon
sudo systemctl enable --now power-profiles-daemon.service

Config custom para dual-battery

Crie /etc/tlp.d/00-thinkpad-t480.conf:

# CPU e platform_profile sao gerenciados pelo power-profiles-daemon.
# TLP cuida de thresholds, Wi-Fi PM e runtime PM.

# Thresholds 40/80 em ambas as baterias
START_CHARGE_THRESH_BAT0=40
STOP_CHARGE_THRESH_BAT0=80
START_CHARGE_THRESH_BAT1=40
STOP_CHARGE_THRESH_BAT1=80

# Usa thinkpad_acpi nativo (T480 suporta)
NATACPI_ENABLE=1
TPACPI_ENABLE=1
TPSMAPI_ENABLE=0

# Wi-Fi power save
WIFI_PWR_ON_AC=off
WIFI_PWR_ON_BAT=on

# Runtime PM em USB/PCIe
RUNTIME_PM_ON_AC=on
RUNTIME_PM_ON_BAT=on

Aplicar imediatamente, sem reboot:

sudo tlp start

Na primeira execução você deve ver:

Warning: CPU_ENERGY_PERF_POLICY_ON_AC/BAT/SAV is not set because power-profiles-daemon is running.
TLP started using profile balanced/BAT (auto).

Esse aviso é esperado — o TLP reconheceu o PPD e está cedendo o CPU para ele.

Por que 40/80?

Baterias de íon-lítio se degradam quando ficam muito tempo em tensões extremas. Manter entre 40% e 80% minimiza o estresse eletroquímico sem sacrificar demais o runtime. Combinações comuns:

FaixaPerfilTrade-off
40/80BalanceadoÓtima vida útil, bom runtime
50/70AgressivoMáxima vida útil, runtime limitado
75/80SuaveRuntime quase cheio, proteção modesta

Para laptop que fica a maior parte do tempo na tomada, 40/80 é o padrão recomendado.

Verificação

sudo tlp-stat -b   # status detalhado das baterias
sudo tlp-stat -s   # status geral
sudo tlp-stat -c   # config efetiva

A saída deve mostrar natacpi (thinkpad_acpi) = active e os thresholds aplicados em ambas. Se a bateria estava acima do threshold quando você aplicou, o TLP não descarrega à força — apenas para de carregar, e ela cai naturalmente com o uso.

Ordem de descarga

O T480 descarrega a externa (BAT1) primeiro e carrega a interna (BAT0) primeiro — comportamento do firmware ACPI. Isso é o ideal: preserva a bateria de difícil troca. O TLP não muda esse comportamento nem precisa.

Se quiser forçar descarga imediata de uma específica (útil se estiver acima do threshold):

sudo tlp fulldischarge BAT1

Só faça desconectado da AC, e o laptop continua usável na outra bateria.

Scripts auxiliares: alternar thresholds e perfis AC/bateria

Pra facilitar a rotina, dois scripts em /usr/local/bin:

cinco-battery-thresholds alterna a config entre dois perfis comuns:

sudo cinco-battery-thresholds home    # 75/80 — laptop na tomada o tempo todo
sudo cinco-battery-thresholds travel  # 75/100 — viagem, máxima autonomia
sudo cinco-battery-thresholds status  # mostra o que está no .conf e no sysfs

O script reescreve START_CHARGE_THRESH_BAT[01] e STOP_CHARGE_THRESH_BAT[01] em /etc/tlp.d/00-thinkpad-t480.conf e roda tlp start pra aplicar.

cinco-power-mode, invocado por uma regra udev em /etc/udev/rules.d/99-power-profile.rules, alterna o perfil de energia quando o AC entra/sai:

SUBSYSTEM=="power_supply", ATTR{type}=="Mains", ATTR{online}=="0", \
  RUN+="/usr/bin/systemd-run --no-block --collect --unit=cinco-power-battery \
        --property=After=power-profiles-daemon.service \
        /usr/local/bin/cinco-power-mode battery"
SUBSYSTEM=="power_supply", ATTR{type}=="Mains", ATTR{online}=="1", \
  RUN+="/usr/bin/systemd-run --no-block --collect --unit=cinco-power-ac \
        --property=After=power-profiles-daemon.service \
        /usr/local/bin/cinco-power-mode ac"

O script seta performance + brilho 80% no AC, e balanced + brilho 40% na bateria.

Cuidado: evite power-saver direto pra bateria. No T480, o intel_pstate em power-saver limita a CPU a ~800-900MHz fixo, sem turbo. Pra trabalho leve é OK; pra desenvolvimento, prefira balanced.

Se o menu de perfis do Omarchy parou de funcionar

Ao clicar no ícone da bateria no waybar, o Omarchy abre um seletor de perfil (performance / balanced / power-saver) via omarchy-menu power. Esse menu chama powerprofilesctl diretamente — se você removeu o power-profiles-daemon em algum momento, o menu fica quebrado.

A correção é instalar o PPD de volta (ele coexiste com o TLP sem conflito):

sudo pacman -S power-profiles-daemon
sudo systemctl enable --now power-profiles-daemon.service
sudo tlp start   # reaplica, TLP detecta PPD e cede CPU

Verifique que os dois convivem:

systemctl is-active power-profiles-daemon.service   # active
systemctl is-active tlp.service                     # active
powerprofilesctl list                               # 3 perfis disponiveis

Atualização: troubleshooting depois de um upgrade do Omarchy

Em maio/2026, depois de um omarchy-update, três coisas quebraram simultaneamente. Documentando porque pode ajudar quem cair no mesmo combo.

Sintoma 1: CPU travada em 800-900MHz

btop mostrava todos os cores arrastando. Causa: o cinco-power-mode battery estava setando power-saver (mostrado acima como exemplo do que evitar), o que via intel_pstate força energy_performance_preference=power e elimina turbo boost.

Fix: editar o script pra cair em balanced por padrão na bateria, com power-saver como fallback:

case "$mode" in
  ac)      set_profile performance balanced ;;
  battery) set_profile balanced power-saver ;;  # antes: 'power-saver balanced'
esac

Sintoma 2: tlp.service em estado failed

journalctl -u tlp.service:

Starting TLP system startup/shutdown...
tlp[XXXX]: Applying power save settings...
tlp.service: Main process exited, code=killed, status=15/TERM
tlp.service: Failed with result 'signal'.

Loop de morte: cada start do tlp.service era morto com SIGTERM. Causa: o unit do power-profiles-daemon traz Conflicts=tuned.service tlp.service auto-cpufreq.service system76-power.service na [Unit]. Quando TLP inicia, systemd manda parar o PPD; PPD reinicia sozinho via Restart=on-failure; systemd mata o TLP em retaliação.

A tentativa óbvia que não funciona nessa versão do systemd:

# /etc/systemd/system/power-profiles-daemon.service.d/override.conf
[Unit]
Conflicts=

systemctl show power-profiles-daemon -p Conflicts continua listando tlp.service. Pra Conflicts=, drop-ins não resetam a lista cumulativa.

Fix que funciona: copiar o unit completo pra /etc/systemd/system/ (que tem precedência) e editar:

sudo cp /usr/lib/systemd/system/power-profiles-daemon.service \
        /etc/systemd/system/power-profiles-daemon.service

sudo sed -i 's|Conflicts=tuned.service tlp.service auto-cpufreq.service system76-power.service|Conflicts=tuned.service auto-cpufreq.service system76-power.service|' \
        /etc/systemd/system/power-profiles-daemon.service

sudo systemctl daemon-reload
sudo systemctl restart tlp.service power-profiles-daemon.service

Verificação:

systemctl show power-profiles-daemon.service -p Conflicts
# Deve mostrar a lista SEM tlp.service

Sintoma 3: BAT1 sumiu de /sys/class/power_supply/

A externa fisicamente encaixada, mas o kernel só lista BAT0. Diagnóstico:

$ ls /sys/class/power_supply/
AC  BAT0       # BAT1 sumiu

$ for d in /sys/bus/acpi/devices/PNP0C0A:*; do
    echo "$d: status=$(cat $d/status)"
  done
/sys/bus/acpi/devices/PNP0C0A:00: status=31    # interna OK
/sys/bus/acpi/devices/PNP0C0A:01: status=0     # slot da externa: vazio

Status 0 significa que ACPI/BIOS reporta “slot vazio” — não é o kernel falhando, é o firmware se recusando a reconhecer.

No T480 a externa é montada via bay/dock: physical_node aponta pra /sys/devices/platform/dock.0, e o slot tem arquivo eject. A SSDT LENOVO Rmv_Batt carrega normalmente. O problema é o EC (Embedded Controller) com cache errado depois do upgrade — ele “esqueceu” do dock event do encaixe.

Existe um bug conhecido (issue #574 do fwupd/firmware-lenovo) onde a atualização de BIOS 1.55 → 1.56 corrompe permanentemente o estado de auth do EC, e nem downgrade resolve — só reflash de SPI externo. No meu caso era mais leve: só cache volátil.

Fix que funcionou:

  1. Reset do EC via Emergency Reset Hole — buraquinho pequeno no fundo do laptop, marcado com seta circular. Desliga, desconecta AC, pressiona com clip de papel por ~10s, liga.

  2. Hot-swap da bateria — destrava, remove fisicamente, espera 5s, recoloca firme até o latch travar. O Power Bridge é projetado pra isso: a interna mantém o sistema rodando.

Depois do reset, ACPI e kernel passaram a enxergar de novo:

$ ls /sys/class/power_supply/
AC  BAT0  BAT1   # voltou

$ cat /sys/bus/acpi/devices/PNP0C0A:01/status
31

Se nem reset nem hot-swap resolverem, é provável que seja a corrupção do issue #574 — aí software não resolve.

Ambiente

  • ThinkPad T480 (BIOS N24ET81W — atualizada do N24ET76W em 2026/04)
  • Arch Linux kernel 6.19
  • Omarchy (Hyprland)
  • TLP 1.10.0
  • thinkpad_acpi nativo