[BUG] platform/x86: bitland-mifs-wmi: performance profiles unreachable on USB-C-only models (RedmiBook Pro 14S)
From: powerfullz
Date: Tue Sep 01 2026 - 03:18:38 EST
Hi Mingyou,
Thanks for getting this driver upstream -- fan/temperature monitoring and
keyboard backlight both work correctly on my machine.
However, the platform_profile implementation makes the two high-power
profiles permanently unreachable on USB-C-only models, and this breaks
power-profiles-daemon entirely.
System information
------------------
Model: RedmiBook Pro 14S (dmidecode -s system-product-name)
CPU: AMD (integrated graphics only, no dGPU)
Charging: USB-C PD only -- this model has no barrel-jack DC input
Kernel: 7.2.2-zen1-1-zen (Arch Linux)
Userspace: power-profiles-daemon
Symptom
-------
$ cat /sys/class/platform-profile/platform-profile-0/name
bitland-mifs-wmi
$ cat /sys/class/platform-profile/platform-profile-0/choices
low-power balanced balanced-performance performance
$ cat /sys/class/platform-profile/platform-profile-0/profile
balanced
$ sudo sh -c 'echo performance > /sys/firmware/acpi/platform_profile'
sh: write error: Operation not supported
$ powerprofilesctl set performance
Failed to communicate with power-profiles-daemon: GDBus.Error:...:
Failed to activate platform driver 'platform_profile': Failed to write
to acpi_platform_profile: Error writing
'/sys/firmware/acpi/platform_profile': Operation not supported (15)
'low-power' and 'balanced' work fine. Only 'performance' and
'balanced-performance' fail, and they fail regardless of whether the
USB-C charger is connected.
Analysis
--------
In bitland_check_performance_capability():
/* Full-speed/performance mode requires DC power (not USB-C) */
if (!power_supply_is_system_supplied())
return -EOPNOTSUPP;
ret = bitland_mifs_wmi_call(data, &input, &output);
if (ret)
return ret;
if (output.data[0] != WMI_SYSTEM_AC_CIRCULARHOLE)
return -EOPNOTSUPP;
WMI_FN_SYSTEM_AC_TYPE can only ever report WMI_SYSTEM_AC_TYPEC on this
machine, because the barrel-jack connector does not physically exist.
The second check therefore evaluates to true unconditionally, and
PLATFORM_PROFILE_PERFORMANCE / PLATFORM_PROFILE_BALANCED_PERFORMANCE are
dead code on this hardware.
This looks like it was written for the barrel-jack gaming models
(Redmi G and similar), where gating full-speed mode on the high-wattage
adapter makes sense. The thin-and-light SKUs share the same MIFS WMI
interface but not the connector.
Secondary issue: API contract
-----------------------------
Independently of the hardware question, advertising a profile in
->probe() via set_bit() and then rejecting it in ->profile_set() is
problematic. Userspace reads 'choices' as the set of supported profiles,
so power-profiles-daemon loads the platform_profile driver, offers a
performance mode to the user, and then fails the whole transaction --
which also prevents the amd_pstate CPU driver from applying its EPP
change, even though amd_pstate alone would have worked fine.
Before 7.1 this machine had no platform_profile at all, ppd used
amd_pstate only, and performance mode worked. The new driver is thus a
functional regression for these models.
Workaround for other users
--------------------------
sudo systemctl edit power-profiles-daemon.service
[Service]
ExecStart=
ExecStart=/usr/lib/power-profiles-daemon --block-driver=platform_profile
hwmon, keyboard backlight, hotkeys and the gpu_mode/kb_mode/fan_boost
attributes all keep working; only ppd's use of platform_profile is
disabled.
Proposed fix
------------
Patch below simply drops the connector-type check and keeps the
on-battery check. Rationale: the EC clamps the power limits according to
the negotiated PD contract anyway, so requesting full-speed mode over
USB-C is safe -- it just yields less headroom than a barrel-jack
adapter would.
If you would rather keep the restriction for the barrel-jack models, the
alternative is to move the capability probe into
platform_profile_probe() and only set_bit() the high-power profiles when
the machine actually supports them, so that 'choices' stays honest and
->profile_set() never fails for an advertised profile. I am happy to
respin in that direction if you prefer, and I can test either version on
the RedmiBook Pro 14S.
Thanks,
powerfullz