]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
ACPI: TAD: Rearrange RT data validation checking
authorRafael J. Wysocki <rafael.j.wysocki@intel.com>
Wed, 4 Mar 2026 18:14:44 +0000 (19:14 +0100)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Sat, 4 Apr 2026 17:18:57 +0000 (19:18 +0200)
Move RT data validation checks from acpi_tad_set_real_time() to
a separate function called acpi_tad_rt_is_invalid() and use it
also in acpi_tad_get_real_time() to validate data coming from
the platform firmware.

Also make acpi_tad_set_real_time() return -EINVAL when the RT data
passed to it is invalid (instead of -ERANGE which is somewhat
confusing) and introduce ACPI_TAD_TZ_UNSPEC to represent the
"unspecified timezone" value.

Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Link: https://patch.msgid.link/3409319.aeNJFYEL58@rafael.j.wysocki
drivers/acpi/acpi_tad.c

index eae8ee42e23f5b73808558640dc1481ab889a86b..240e5d53c4a5a754c6b01b7ef83941c53efba7ae 100644 (file)
@@ -49,6 +49,9 @@ MODULE_AUTHOR("Rafael J. Wysocki");
 /* Special value for disabled timer or expired timer wake policy. */
 #define ACPI_TAD_WAKE_DISABLED (~(u32)0)
 
+/* ACPI TAD RTC */
+#define ACPI_TAD_TZ_UNSPEC     2047
+
 struct acpi_tad_driver_data {
        u32 capabilities;
 };
@@ -67,6 +70,16 @@ struct acpi_tad_rt {
        u8 padding[3]; /* must be 0 */
 } __packed;
 
+static bool acpi_tad_rt_is_invalid(struct acpi_tad_rt *rt)
+{
+       return rt->year < 1900 || rt->year > 9999 ||
+           rt->month < 1 || rt->month > 12 ||
+           rt->hour > 23 || rt->minute > 59 || rt->second > 59 ||
+           rt->tz < -1440 ||
+           (rt->tz > 1440 && rt->tz != ACPI_TAD_TZ_UNSPEC) ||
+           rt->daylight > 3;
+}
+
 static int acpi_tad_set_real_time(struct device *dev, struct acpi_tad_rt *rt)
 {
        acpi_handle handle = ACPI_HANDLE(dev);
@@ -80,12 +93,8 @@ static int acpi_tad_set_real_time(struct device *dev, struct acpi_tad_rt *rt)
        unsigned long long retval;
        acpi_status status;
 
-       if (rt->year < 1900 || rt->year > 9999 ||
-           rt->month < 1 || rt->month > 12 ||
-           rt->hour > 23 || rt->minute > 59 || rt->second > 59 ||
-           rt->tz < -1440 || (rt->tz > 1440 && rt->tz != 2047) ||
-           rt->daylight > 3)
-               return -ERANGE;
+       if (acpi_tad_rt_is_invalid(rt))
+               return -EINVAL;
 
        args[0].buffer.pointer = (u8 *)rt;
        args[0].buffer.length = sizeof(*rt);
@@ -145,6 +154,9 @@ static int acpi_tad_get_real_time(struct device *dev, struct acpi_tad_rt *rt)
        if (ret)
                return ret;
 
+       if (acpi_tad_rt_is_invalid(rt))
+               return -ENODATA;
+
        return 0;
 }