2018-10-29

Manjaro i Asus GL702ZC - konfiguracja chłodzenia Ryzen 7 1700 na Linuxie

W tym roku wymieniłem swój stary, leciwy już laptop, chodzący na Pentiumie jeszcze, na nowiutkiego, 8 rdzeniowego potwora z Ryzenem 7 1700, 32 GB RAM i 256 GB SSD PCI-E M2 na pokładzie.

Przeskok oczywiście niesamowity, niemniej jednak zaniepokoiło mnie coś, o czym pisałem już w innymi wpisie - wysokie temperatury i ogólne problemy ze wsparciem sprzętu.

W skrócie - kernel jeszcze nie obsługiwał tej konkretnej konfiguracji zbyt dobrze, przez co laptop rozgrzewał się do temperatur o wiele wyższych, niż mógłbym sobie tego życzyć.

Jednakże niedawno, mimo całego zamieszania wokół świata Linuxa, wyszła wersja 4.19 jądra. Przeglądając changelog natknąłem się tam na wzmiankę o czymś takim jak steronwnik k10temp, oraz rzekomo lepsze wsparcie dla pewnych procesorów z rodziny Ryzen/Threadripper. Zaświeciła mi się lampka.

Nie zrozumcie mnie źle, Windows nie jest zły - jak pisałem, to tylko narzędzie, ale fajnie by jednak było móc siedzieć sobie na Linuxie jako hoście. Oj tak.

A więc postanowiłem się trochę pobawić i sprawdzić, czy faktycznie coś się zmieniło.

Manjaro to the rescue!

Dystrybucje, które najszybciej adaptują nowe kernele bez większych problemów, to zazwyczaj te, które mają cykl wydawniczy Rolling Release - oznacza to tyle, że nia ma tam jakiś konkretnych wersji, które są wspierane przez X czasu, nasz system jest ciągle aktualizowany po prostu.

Jedną z takich dystrybucji jest dystrybucja Manjaro. Świetna sprawa, ogółem super system, polecam.

W każdym razie. Zainstalowałem i zacząłem bój. I co?

Otóż, wyobraźcie sobie, udało się. Niżej przedstawiam jakie kroki podjąłem - jeśli ktoś z was również korzysta z tej konfiguracji sprzętowej, to być może skorzysta.

Pierwszą rzeczą, którą musiałem zrobić, to upewnienie się, czy posiadam zainstalowane dwie paczki tak w zasadzie - lm_sensors oraz lib32-lm_sensors.

Jeśli takowe posiadamy, (ja miałem je zainstalowane domyślnie), to wskakujemy do kochanej konsoli i wpisujemy:

sudo sensors-detect

Po czym wszystko potwierdzamy. Na koniec moim oczom ukazała się taka oto wiadomość:

Driver `k10temp' (autoloaded):

- Chip `AMD Family 17h thermal sensors' (confidence: 9)

Wiedziałem, że jestem w domu. Po tem jeszcze wpisałem sensors , które faktycznie wydrukowało mi wskaźniki temperatur!

Po chwili googlowania, wyczytałem, iż dobrze by było zainstalować jeszcze: asus-fan-dkms-git

Kluczem do sukcesu okazała się jednak paczka nbfc

Zainstalować ją można prosto z AUR'a, ale do wyboru są dwie paczki - nbfc i nbfc-git

Ja wybrałem tą drugą, gdyż może ona być kapkę nowsza czasem, a mi zależało na jak najświeższej wersji.

Jak instalować z AURa? Potrzebny nam yaourt

Notka: Jak słusznie zauważył Aryman1983, zapomniałem doprecyzować tu jednej rzeczy: yaourt nie jest tu jedynym rozwiązaniem do instalacji pakietów z AUR, istnieje masa innych programów do tego służąych, lepszych i gorszych. yaourt nie jest jakimś standardem.

Czyli:

sudo pacman -Syu yaourt
yaourt nbfc-git

W zależności od potrzeby, czasem do tego yaourta trzeba dorzucić sudo, ale z tym bym uważał, bo to paczki z AUR'a jednak, a potrafią być one niebezpieczne (bardzo, bardzo rzadko), ale jednak.

Zgodnie z dokumentacją nbfc , odpalam serwis.

systemctl start nbfc.service

Potem już tylko

nbfc config -r

które ma mi zasugerować jaki config powinienem wybrać dla mojego sprzętu. Niestety dla laptopa GL702ZC takowy nie istniał, ale dostałem rekomendację zbliżonego - GL702VM, który co prawda sprzętowo jest zupełnie inny, ale cóż... A może zadziała?

Odpalam zatem następujące polecenie:

nbfc config -a "Asus ROG GL702VM"

Niestety, rzuca mi błędem. Podobnież znany problem, wystarczyło wpisać:

mv /opt/nbfc/Plugins/StagWare.Plugins.ECSysLinux.dll /opt/nbfc/Plugins/StagWare.Plugins.ECSysLinux.dll.old

I ponowić próbę.

Chwila prawdy i.... Działa. Wiatrak zaczyna pracować inaczej. Sukces.

Teraz tylko problem, bo dalej nie chodzi tak, jak chciałem - a to wiatrak od GPU się nie załącza kiedy trzeba, a to wiatrak od CPU za szybko i głośno chodzi. Coś ten config mi nie odpowiadał i to bardzo. Cóż miałem zatem zrobić, jak nie napisać swój. Biorę się do roboty zatem.

Okazało się to nie za trudne - jedynie męczące było ustalenie odpowiednich rejestrów Embedded Controllera, które odpowiadają za kontrolowanie prędkości wiatraczków, niemniej jednak narzędzie ec-probe przyszło mi z pomocą. Jak? A no albo rzucasz ec-probe monitor —clearly lub co jakiś czas ec-probe dump to wyświetla nam rejestry, tylko skąd wiedzieć, który jest odpowiedni?

Wybrałem prostą metodę - obciążając mocno CPU/GPU wymuszałem szybszą pracę wiatraków, wtedy też od razu zmieniały się wartości w rejestrze, co sugerowało, że to ten poszukiwany. Jak to zrobić? Do obciążania CPU/pamięci/dysku jest fajna paczka - stress , po jej instalacji wystarczy wpisać, w przypadku ryzena 7:

stress --cpu 16 --timeout 60

I już przez 60 sekund nasze CPU będzie w 100% obciążone, co wymusi szybkie odpalenie się wiatraczków. Rejestr ustalony.

Dla GPU analogicznie, tylko zamiast stress, korzystam z glmark2 .

Jak się okazuje, za wiatraczki odpowiadają rejestry spod adresów 0xA0 i 0xA6, czy też raczej 160, 166. No to wstawiam je do configu, metodą prób i błędów ustalam jakie prędkości będą dobre przy jakich temperaturach tak, żeby za głośno laptop nie chodził przypadkiem jeśli temperatura jest niska, ale i żeby na wyższych dobrze chłodził. Ostatecznie coś takiego mi wyszło:

<?xml version="1.0"?>
<FanControlConfigV2 xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <NotebookModel>GL702ZC</NotebookModel>
  <Author>grski</Author>
  <EcPollInterval>500</EcPollInterval>
  <ReadWriteWords>false</ReadWriteWords>
  <CriticalTemperature>90</CriticalTemperature>
  <FanConfigurations>
    <FanConfiguration>
      <ReadRegister>151</ReadRegister>
      <WriteRegister>151</WriteRegister>
      <MinSpeedValue>0</MinSpeedValue>
      <MaxSpeedValue>8</MaxSpeedValue>
      <IndependentReadMinMaxValues>false</IndependentReadMinMaxValues>
      <MinSpeedValueRead>0</MinSpeedValueRead>
      <MaxSpeedValueRead>0</MaxSpeedValueRead>
      <ResetRequired>true</ResetRequired>
      <FanSpeedResetValue>8</FanSpeedResetValue>
      <FanDisplayName>CPU</FanDisplayName>
      <TemperatureThresholds>
        <TemperatureThreshold>
          <UpThreshold>30</UpThreshold>
          <DownThreshold>0</DownThreshold>
          <FanSpeed>0</FanSpeed>
        </TemperatureThreshold>
        <TemperatureThreshold>
          <UpThreshold>45</UpThreshold>
          <DownThreshold>40</DownThreshold>
          <FanSpeed>12.5</FanSpeed>
        </TemperatureThreshold>
        <TemperatureThreshold>
          <UpThreshold>65</UpThreshold>
          <DownThreshold>50</DownThreshold>
          <FanSpeed>37.5</FanSpeed>
        </TemperatureThreshold>
        <TemperatureThreshold>
          <UpThreshold>70</UpThreshold>
          <DownThreshold>60</DownThreshold>
          <FanSpeed>50</FanSpeed>
        </TemperatureThreshold>
        <TemperatureThreshold>
          <UpThreshold>75</UpThreshold>
          <DownThreshold>65</DownThreshold>
          <FanSpeed>75</FanSpeed>
        </TemperatureThreshold>
        <TemperatureThreshold>
          <UpThreshold>79</UpThreshold>
          <DownThreshold>72</DownThreshold>
          <FanSpeed>100</FanSpeed>
        </TemperatureThreshold>
        <TemperatureThreshold>
          <UpThreshold>85</UpThreshold>
          <DownThreshold>75</DownThreshold>
          <FanSpeed>100</FanSpeed>
        </TemperatureThreshold>
      </TemperatureThresholds>
      <FanSpeedPercentageOverrides />
    </FanConfiguration>
    <FanConfiguration>
      <ReadRegister>152</ReadRegister>
      <WriteRegister>152</WriteRegister>
      <MinSpeedValue>0</MinSpeedValue>
      <MaxSpeedValue>8</MaxSpeedValue>
      <IndependentReadMinMaxValues>false</IndependentReadMinMaxValues>
      <MinSpeedValueRead>0</MinSpeedValueRead>
      <MaxSpeedValueRead>0</MaxSpeedValueRead>
      <ResetRequired>true</ResetRequired>
      <FanSpeedResetValue>8</FanSpeedResetValue>
      <FanDisplayName>GPU</FanDisplayName>
      <TemperatureThresholds>
        <TemperatureThreshold>
          <UpThreshold>30</UpThreshold>
          <DownThreshold>0</DownThreshold>
          <FanSpeed>0</FanSpeed>
        </TemperatureThreshold>
        <TemperatureThreshold>
          <UpThreshold>45</UpThreshold>
          <DownThreshold>40</DownThreshold>
          <FanSpeed>12.5</FanSpeed>
        </TemperatureThreshold>
        <TemperatureThreshold>
          <UpThreshold>65</UpThreshold>
          <DownThreshold>50</DownThreshold>
          <FanSpeed>37.5</FanSpeed>
        </TemperatureThreshold>
        <TemperatureThreshold>
          <UpThreshold>70</UpThreshold>
          <DownThreshold>60</DownThreshold>
          <FanSpeed>50</FanSpeed>
        </TemperatureThreshold>
        <TemperatureThreshold>
          <UpThreshold>75</UpThreshold>
          <DownThreshold>65</DownThreshold>
          <FanSpeed>75</FanSpeed>
        </TemperatureThreshold>
        <TemperatureThreshold>
          <UpThreshold>79</UpThreshold>
          <DownThreshold>72</DownThreshold>
          <FanSpeed>100</FanSpeed>
        </TemperatureThreshold>
        <TemperatureThreshold>
          <UpThreshold>85</UpThreshold>
          <DownThreshold>75</DownThreshold>
          <FanSpeed>100</FanSpeed>
        </TemperatureThreshold>
      </TemperatureThresholds>
      <FanSpeedPercentageOverrides />
    </FanConfiguration>
  </FanConfigurations>
  <RegisterWriteConfigurations>
    <RegisterWriteConfiguration>
      <WriteMode>Set</WriteMode>
      <WriteOccasion>OnWriteFanSpeed</WriteOccasion>
      <Register>160</Register>
      <Value>10</Value>
      <ResetRequired>true</ResetRequired>
      <ResetValue>10</ResetValue>
      <ResetWriteMode>Set</ResetWriteMode>
      <Description>CPU FAN</Description>
    </RegisterWriteConfiguration>
    <RegisterWriteConfiguration>
      <WriteMode>Set</WriteMode>
      <WriteOccasion>OnWriteFanSpeed</WriteOccasion>
      <Register>166</Register>
      <Value>10</Value>
      <ResetRequired>true</ResetRequired>
      <ResetValue>10</ResetValue>
      <ResetWriteMode>Set</ResetWriteMode>
      <Description>GPU FAN</Description>
    </RegisterWriteConfiguration>
  </RegisterWriteConfigurations>
</FanControlConfigV2>

Teraz już tylko zapisanie tego pliku do "/opt/nbfc/Configs/Asus ROG GL702ZC.xml"

oraz odpalenie

nbfc config -a "Asus ROG GL702ZC"

Finito. Działa wszystko tak, jak chciałem. A jak działa, to czemu by się z kimś nie podzielić - zrobiłem zatem PR'kę do repo nbfc i czekam teraz na odpowiedź.

Na koniec przydałoby się jednak jeszcze to, by ta usługa odpalała się automatycznie po uruchomieniu komputera, a więc jeszcze:

systemctl enable nbfc.service

Teraz już serio gotowe.

Męczący, to był dzień i wyzwanie, zajęło mi to kilka godzin, ale fajnie. Lubię takie przygody.