Commit 3329a141 authored by Rafael J. Wysocki's avatar Rafael J. Wysocki
Browse files

ACPI: TAD: Rearrange RT data validation checking



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: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
Link: https://patch.msgid.link/3409319.aeNJFYEL58@rafael.j.wysocki
parent e64ab3e2
Loading
Loading
Loading
Loading
+18 −6
Original line number Diff line number Diff line
@@ -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;
}