lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID:
 <DS7PR12MB606995B08A344C01711C7BCC9201A@DS7PR12MB6069.namprd12.prod.outlook.com>
Date: Wed, 3 Sep 2025 15:22:37 +0000
From: "T, Harini" <Harini.T@....com>
To: "T, Harini" <Harini.T@....com>, "alexandre.belloni@...tlin.com"
	<alexandre.belloni@...tlin.com>, "Simek, Michal" <michal.simek@....com>
CC: "linux-rtc@...r.kernel.org" <linux-rtc@...r.kernel.org>,
	"linux-arm-kernel@...ts.infradead.org"
	<linux-arm-kernel@...ts.infradead.org>, "linux-kernel@...r.kernel.org"
	<linux-kernel@...r.kernel.org>, "git (AMD-Xilinx)" <git@....com>
Subject: RE: [PATCH V2] rtc: zynqmp: Restore alarm functionality after kexec
 transition

[Public]

Hi Alexandre,

> -----Original Message-----
> From: Harini T <harini.t@....com>
> Sent: Wednesday, July 30, 2025 7:51 PM
> To: alexandre.belloni@...tlin.com; Simek, Michal
> <michal.simek@....com>
> Cc: linux-rtc@...r.kernel.org; linux-arm-kernel@...ts.infradead.org; linux-
> kernel@...r.kernel.org; git (AMD-Xilinx) <git@....com>; T, Harini
> <Harini.T@....com>
> Subject: [PATCH V2] rtc: zynqmp: Restore alarm functionality after kexec
> transition
>
> Caution: This message originated from an External Source. Use proper
> caution when opening attachments, clicking links, or responding.
>
>
> During kexec reboots, RTC alarms that are fired during the kernel transition
> experience delayed execution. The new kernel would eventually honor these
> alarms, but the interrupt handlers would only execute after the driver probe
> is completed rather than at the intended alarm time.
>
> This is because pending alarm interrupt status from the previous kernel is not
> properly cleared during driver initialization, causing timing discrepancies in
> alarm delivery.
>
> To ensure precise alarm timing across kexec transitions, enhance the probe
> function to:
> 1. Clear any pending alarm interrupt status from previous boot.
> 2. Detect existing valid alarms and preserve their state.
> 3. Re-enable alarm interrupts for future alarms.
>
> Signed-off-by: Harini T <harini.t@....com>
> ---
> Changes in V2:
> - Remove shutdown handler to prevent alarm interrupts from being
>   disabled during kexec transitions.
> - Add alarm state detection and restoration in probe.
>
> V1 link: https://lore.kernel.org/linux-rtc/20250724170517.974356-1-
> harini.t@....com/T/#u
> ---
>  drivers/rtc/rtc-zynqmp.c | 19 +++++++++++++++++++
>  1 file changed, 19 insertions(+)
>
> diff --git a/drivers/rtc/rtc-zynqmp.c b/drivers/rtc/rtc-zynqmp.c index
> f39102b66eac..3baa2b481d9f 100644
> --- a/drivers/rtc/rtc-zynqmp.c
> +++ b/drivers/rtc/rtc-zynqmp.c
> @@ -277,6 +277,10 @@ static irqreturn_t xlnx_rtc_interrupt(int irq, void *id)
> static int xlnx_rtc_probe(struct platform_device *pdev)  {
>         struct xlnx_rtc_dev *xrtcdev;
> +       bool is_alarm_set = false;
> +       u32 pending_alrm_irq;
> +       u32 current_time;
> +       u32 alarm_time;
>         int ret;
>
>         xrtcdev = devm_kzalloc(&pdev->dev, sizeof(*xrtcdev), GFP_KERNEL); @@
> -296,6 +300,17 @@ static int xlnx_rtc_probe(struct platform_device *pdev)
>         if (IS_ERR(xrtcdev->reg_base))
>                 return PTR_ERR(xrtcdev->reg_base);
>
> +       /* Clear any pending alarm interrupts from previous kernel/boot */
> +       pending_alrm_irq = readl(xrtcdev->reg_base + RTC_INT_STS) &
> RTC_INT_ALRM;
> +       if (pending_alrm_irq)
> +               writel(pending_alrm_irq, xrtcdev->reg_base +
> + RTC_INT_STS);
> +
> +       /* Check if a valid alarm is already set from previous kernel/boot */
> +       alarm_time = readl(xrtcdev->reg_base + RTC_ALRM);
> +       current_time = readl(xrtcdev->reg_base + RTC_CUR_TM);
> +       if (alarm_time > current_time && alarm_time != 0)
> +               is_alarm_set = true;
> +
>         xrtcdev->alarm_irq = platform_get_irq_byname(pdev, "alarm");
>         if (xrtcdev->alarm_irq < 0)
>                 return xrtcdev->alarm_irq; @@ -337,6 +352,10 @@ static int
> xlnx_rtc_probe(struct platform_device *pdev)
>
>         xlnx_init_rtc(xrtcdev);
>
> +       /* Re-enable alarm interrupt if a valid alarm was found */
> +       if (is_alarm_set)
> +               writel(RTC_INT_ALRM, xrtcdev->reg_base + RTC_INT_EN);
> +
>         device_init_wakeup(&pdev->dev, true);
>
>         return devm_rtc_register_device(xrtcdev->rtc);
> --
> 2.43.0
>

Kindly following up on this patch. I would appreciate it if you could review it when convenient and let me know if any updates are needed.

Thank you for your time.

Best regards,
Harini T

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ