[PATCH v1 3/4] ACPI: TAD: RTC: Refine timer value computations and checks

Rafael J. Wysocki posted 1 patch 1 month, 3 weeks ago
drivers/acpi/acpi_tad.c |    8 +++-----
1 file changed, 3 insertions(+), 5 deletions(-)
[PATCH v1 3/4] ACPI: TAD: RTC: Refine timer value computations and checks
Posted by Rafael J. Wysocki 1 month, 3 weeks ago
From: Rafael J. Wysocki <rafael.j.wysocki@intel.com>

Since rtc_tm_to_ktime() may overflow for large RTC time values and
full second granularity is sufficient in timer value computations
in acpi_tad_rtc_set_alarm() and acpi_tad_rtc_read_alarm(), use
rtc_tm_to_time64() instead of that function, which also allows the
computations to be simplified.

Moreover, U32_MAX is a special "timer disabled" value, so make
acpi_tad_rtc_set_alarm() reject it when attempting to program the
alarm timers.

Fixes: 7572dcabe38d ("ACPI: TAD: Add alarm support to the RTC class device interface")
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
---
 drivers/acpi/acpi_tad.c |    8 +++-----
 1 file changed, 3 insertions(+), 5 deletions(-)

--- a/drivers/acpi/acpi_tad.c
+++ b/drivers/acpi/acpi_tad.c
@@ -680,9 +680,8 @@ static int acpi_tad_rtc_set_alarm(struct
 
 		acpi_tad_rt_to_tm(&rt, &tm_now);
 
-		value = ktime_divns(ktime_sub(rtc_tm_to_ktime(t->time),
-					      rtc_tm_to_ktime(tm_now)), NSEC_PER_SEC);
-		if (value <= 0 || value > U32_MAX)
+		value = rtc_tm_to_time64(&t->time) - rtc_tm_to_time64(&tm_now);
+		if (value <= 0 || value >= U32_MAX)
 			return -EINVAL;
 	}
 
@@ -745,8 +744,7 @@ static int acpi_tad_rtc_read_alarm(struc
 
 	if (retval != ACPI_TAD_WAKE_DISABLED) {
 		t->enabled = 1;
-		t->time = rtc_ktime_to_tm(ktime_add_ns(rtc_tm_to_ktime(tm_now),
-						       (u64)retval * NSEC_PER_SEC));
+		rtc_time64_to_tm(rtc_tm_to_time64(&tm_now) + retval, &t->time);
 	} else {
 		t->enabled = 0;
 		t->time = tm_now;
Re: [PATCH v1 3/4] ACPI: TAD: RTC: Refine timer value computations and checks
Posted by Alexandre Belloni 1 month, 3 weeks ago
On 22/04/2026 17:26:49+0200, Rafael J. Wysocki wrote:
> From: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
> 
> Since rtc_tm_to_ktime() may overflow for large RTC time values and
> full second granularity is sufficient in timer value computations
> in acpi_tad_rtc_set_alarm() and acpi_tad_rtc_read_alarm(), use
> rtc_tm_to_time64() instead of that function, which also allows the
> computations to be simplified.
> 
> Moreover, U32_MAX is a special "timer disabled" value, so make
> acpi_tad_rtc_set_alarm() reject it when attempting to program the
> alarm timers.
> 
> Fixes: 7572dcabe38d ("ACPI: TAD: Add alarm support to the RTC class device interface")
> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>

Reviewed-by: Alexandre Belloni <alexandre.belloni@bootlin.com>

> ---
>  drivers/acpi/acpi_tad.c |    8 +++-----
>  1 file changed, 3 insertions(+), 5 deletions(-)
> 
> --- a/drivers/acpi/acpi_tad.c
> +++ b/drivers/acpi/acpi_tad.c
> @@ -680,9 +680,8 @@ static int acpi_tad_rtc_set_alarm(struct
>  
>  		acpi_tad_rt_to_tm(&rt, &tm_now);
>  
> -		value = ktime_divns(ktime_sub(rtc_tm_to_ktime(t->time),
> -					      rtc_tm_to_ktime(tm_now)), NSEC_PER_SEC);
> -		if (value <= 0 || value > U32_MAX)
> +		value = rtc_tm_to_time64(&t->time) - rtc_tm_to_time64(&tm_now);
> +		if (value <= 0 || value >= U32_MAX)
>  			return -EINVAL;
>  	}
>  
> @@ -745,8 +744,7 @@ static int acpi_tad_rtc_read_alarm(struc
>  
>  	if (retval != ACPI_TAD_WAKE_DISABLED) {
>  		t->enabled = 1;
> -		t->time = rtc_ktime_to_tm(ktime_add_ns(rtc_tm_to_ktime(tm_now),
> -						       (u64)retval * NSEC_PER_SEC));
> +		rtc_time64_to_tm(rtc_tm_to_time64(&tm_now) + retval, &t->time);
>  	} else {
>  		t->enabled = 0;
>  		t->time = tm_now;
> 
> 
> 

-- 
Alexandre Belloni, co-owner and COO, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com