Acer Nitro is a good budget powerful laptop with some good cooling system. But it has a big issue: it’s proprietary and really incosistent. To control fans, the system writes value to the embedded controller, so we can make use of open-source tools to write on the controller.
First, you need to install ACPI_EC kernel module, manually enroll the keys in /var/lib/dkms if using secure boot.
Next, we install nfbc-linux.
This specific laptop (AN515-47) currently has no configuration, so i went to Windows, install nfbc to use ec-probe and dump the EC RAM while messing with NitroSense in order to research how it behaves. It’s quite similar to AN515-45, with the difference on some features (such as not having Acer CoolerBoost), these are the hexadecimal addresses and values i’ve found out:
GPU Fan Speed Write: 0x3A (Max 0x64)
GPU Fan Speed Read: 0x15
CPU Fan Speed Write: 0x37 (Max 0x64)
CPU Fan Speed Read: 0x13GPU auto mode: 0x21 (0x10 Auto 0x30 Manual)
CPU auto mode: 0x22 (0x04 Auto 0x0C Manual)80% charge limit: 0xDD (0x00 Off 0x80 On)
Keyboard light automatic turn off: 0x06 (0x00 Disabled 0x1E Enabled)
Energy mode: 0x2C (0x01 Standard 0x00 Quiet 0x04 Performance)Microphone key LED: 0x30 (0x10 On 0x00 Off) - Not possible to manually change, seems to be managed by BIOS. Only the 4th bit is used. Useful information for this thread.
Based on this data, i’ve created a new configuration. I didn’t made a pull request yet since i’ve to test it for awhile.
{
"NotebookModel": "Acer Nitro AN515-47",
"Author": "Josesk Volpe",
"EcPollInterval": 3000,
"ReadWriteWords": true,
"CriticalTemperature": 90,
"FanConfigurations": [
{
"ReadRegister": 19,
"WriteRegister": 55,
"MinSpeedValue": 0,
"MaxSpeedValue": 100,
"IndependentReadMinMaxValues": true,
"MinSpeedValueRead": 0,
"MaxSpeedValueRead": 7317,
"ResetRequired": true,
"FanSpeedResetValue": 0,
"FanDisplayName": "CPU fan",
"TemperatureThresholds": [
{
"UpThreshold": 40,
"DownThreshold": 0,
"FanSpeed": 0.0
},
{
"UpThreshold": 60,
"DownThreshold": 38,
"FanSpeed": 10.0
},
{
"UpThreshold": 70,
"DownThreshold": 50,
"FanSpeed": 30.0
},
{
"UpThreshold": 75,
"DownThreshold": 60,
"FanSpeed": 50.0
},
{
"UpThreshold": 80,
"DownThreshold": 60,
"FanSpeed": 60.0
},
{
"UpThreshold": 85,
"DownThreshold": 70,
"FanSpeed": 80.0
},
{
"UpThreshold": 90,
"DownThreshold": 70,
"FanSpeed": 100.0
}
],
"FanSpeedPercentageOverrides": []
},
{
"ReadRegister": 21,
"WriteRegister": 58,
"MinSpeedValue": 0,
"MaxSpeedValue": 100,
"IndependentReadMinMaxValues": true,
"MinSpeedValueRead": 0,
"MaxSpeedValueRead": 7317,
"ResetRequired": true,
"FanSpeedResetValue": 0,
"FanDisplayName": "GPU fan",
"TemperatureThresholds": [
{
"UpThreshold": 40,
"DownThreshold": 0,
"FanSpeed": 0.0
},
{
"UpThreshold": 60,
"DownThreshold": 38,
"FanSpeed": 10.0
},
{
"UpThreshold": 70,
"DownThreshold": 50,
"FanSpeed": 30.0
},
{
"UpThreshold": 75,
"DownThreshold": 50,
"FanSpeed": 50.0
},
{
"UpThreshold": 79,
"DownThreshold": 60,
"FanSpeed": 60.0
},
{
"UpThreshold": 80,
"DownThreshold": 65,
"FanSpeed": 80.0
},
{
"UpThreshold": 90,
"DownThreshold": 70,
"FanSpeed": 100.0
}
],
"FanSpeedPercentageOverrides": []
}
],
"RegisterWriteConfigurations": [
{
"WriteMode": "Set",
"WriteOccasion": "OnInitialization",
"Register": 34,
"Value": 12,
"ResetRequired": true,
"ResetValue": 4,
"ResetWriteMode": "Set",
"Description": "CPU fan manual mode"
},
{
"WriteMode": "Set",
"WriteOccasion": "OnInitialization",
"Register": 33,
"Value": 48,
"ResetRequired": true,
"ResetValue": 16,
"ResetWriteMode": "Set",
"Description": "GPU fan manual mode"
}
]
}
¡It works! But… There’s a big issue…
If we boot the laptop directly on Linux, it keeps on the standard automatic fan control by BIOS, we still can’t control the fans ourselves. ¿Why is it bad? As i live in a semi-tropical country, i usually have quite hot days. If we play a game, in about 35 minutes we can get our GPU to 87ºC, while BIOS won’t speed up fans above 65% to decrease it. Also, even if we don’t have this issue, we still would like to be able to control it, ¿yeah?
To be able to control it under Linux, we have to boot on Windows, login, reboot (do not turn off) and boot on Linux. Then we can control it on Linux or any other operating system.
In Windows, there’s a task schedule to automatically startup PSLauncher.exe once we login (C:\Program Files\Acer\NitroSense Service\PSLauncher.exe). I suppose that NitroSense loads up firmware in BIOS so it can be managed from user-space. If the firmware is not present, it uses the basic fan controller, which doesn’t reads data in EC to control the fans. Since it’s loaded in a volatile memory, it’s gone once the laptop is powered off.
I’ve currently found no way to load the firmware under Linux, neither yet confirmed that’s the case.