The ACPI specification says:
"If an error occurs while obtaining the meter reading or if the value
is not available then an Integer with all bits set is returned"
Since the "integer" is 32 bits in case of the ACPI power meter,
userspace will get a power reading of 2^32 * 1000 miliwatts (~4.29 MW)
in case of such an error. This was discovered due to a lm_sensors
bugreport (https://github.com/lm-sensors/lm-sensors/issues/460).
Fix this by returning -ENODATA instead.
Tested-by: <urbinek@gmail.com>
Fixes: de584afa5e18 ("hwmon driver for ACPI 4.0 power meters")
Signed-off-by: Armin Wolf <W_Armin@gmx.de>
Link: https://lore.kernel.org/r/20231124182747.13956-1-W_Armin@gmx.de
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
 #define POWER_METER_CAN_NOTIFY (1 << 3)
 #define POWER_METER_IS_BATTERY (1 << 8)
 #define UNKNOWN_HYSTERESIS     0xFFFFFFFF
+#define UNKNOWN_POWER          0xFFFFFFFF
 
 #define METER_NOTIFY_CONFIG    0x80
 #define METER_NOTIFY_TRIP      0x81
        update_meter(resource);
        mutex_unlock(&resource->lock);
 
+       if (resource->power == UNKNOWN_POWER)
+               return -ENODATA;
+
        return sprintf(buf, "%llu\n", resource->power * 1000);
 }