
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ínio | Responsável |
|---|---|
| Thresholds de carga (40/80) | TLP |
| Dual-battery / ordem de descarga | TLP (via firmware) |
| Runtime PM em USB/PCIe | TLP |
| Wi-Fi power save por AC/BAT | TLP |
| Menu de perfis (performance / balanced / power-saver) | power-profiles-daemon |
| CPU governor e EPP | power-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:
| Faixa | Perfil | Trade-off |
|---|---|---|
| 40/80 | Balanceado | Ótima vida útil, bom runtime |
| 50/70 | Agressivo | Máxima vida útil, runtime limitado |
| 75/80 | Suave | Runtime 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:
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.
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