All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/2] rtc: cmos: Fix non-ACPI (non-x86) platform support
@ 2018-10-02  1:08 Maciej W. Rozycki
  2018-10-02  1:08 ` [PATCH 1/2] rtc: cmos: Fix non-ACPI undefined reference to `hpet_rtc_interrupt' Maciej W. Rozycki
                   ` (2 more replies)
  0 siblings, 3 replies; 4+ messages in thread
From: Maciej W. Rozycki @ 2018-10-02  1:08 UTC (permalink / raw)
  To: Alessandro Zummo, Alexandre Belloni; +Cc: linux-rtc, linux-kernel

Hi,

 This mini patch series fixes issues introduced recently for non-ACPI 
platforms using `rtc-cmos'.  Please see individual change descriptions for 
details.

 These have been run-time verified with the DECstation (arch/mips/dec).  
Please apply.

  Maciej

^ permalink raw reply	[flat|nested] 4+ messages in thread

* [PATCH 1/2] rtc: cmos: Fix non-ACPI undefined reference to `hpet_rtc_interrupt'
  2018-10-02  1:08 [PATCH 0/2] rtc: cmos: Fix non-ACPI (non-x86) platform support Maciej W. Rozycki
@ 2018-10-02  1:08 ` Maciej W. Rozycki
  2018-10-02  1:09 ` [PATCH 2/2] rtc: cmos: Remove the `use_acpi_alarm' module parameter for !ACPI Maciej W. Rozycki
  2018-10-04 10:29 ` [PATCH 0/2] rtc: cmos: Fix non-ACPI (non-x86) platform support Alexandre Belloni
  2 siblings, 0 replies; 4+ messages in thread
From: Maciej W. Rozycki @ 2018-10-02  1:08 UTC (permalink / raw)
  To: Alessandro Zummo, Alexandre Belloni; +Cc: linux-rtc, linux-kernel, stable

Fix a commit 311ee9c151ad ("rtc: cmos: allow using ACPI for RTC alarm 
instead of HPET") `rtc-cmos' regression causing a link error:

drivers/rtc/rtc-cmos.o: In function `cmos_platform_probe':
rtc-cmos.c:(.init.text+0x33c): undefined reference to `hpet_rtc_interrupt'
rtc-cmos.c:(.init.text+0x3f4): undefined reference to `hpet_rtc_interrupt'

with non-ACPI platforms using this driver.  The cause is the change of 
the condition guarding the use of `hpet_rtc_interrupt'.

Previously it was a call to `is_hpet_enabled'.  That function is static 
inline and has a hardcoded 0 result for non-ACPI platforms, which imply 
!HPET_EMULATE_RTC.  Consequently the compiler optimized the whole block 
away including the reference to `hpet_rtc_interrupt', which never made 
it to the link stage.

Now the guarding condition is a call to `use_hpet_alarm', which is not 
static inline and therefore the compiler may not be able to prove that 
it actually always returns 0 for non-ACPI platforms.  Consequently the 
build breaks with an unsatisfied reference, because `hpet_rtc_interrupt' 
is nowhere defined at link time.

Fix the problem by marking `use_hpet_alarm' inline.  As the `inline' 
keyword serves as an optimization hint rather than a requirement the 
compiler is still free to choose whether inlining will be beneficial or 
not for ACPI platforms.

Signed-off-by: Maciej W. Rozycki <macro@linux-mips.org>
Fixes: 311ee9c151ad ("rtc: cmos: allow using ACPI for RTC alarm instead of HPET")
Cc: stable@vger.kernel.org # 4.18+
---
 drivers/rtc/rtc-cmos.c |    2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

linux-rtc-cmos-use-hpet-alarm-inline.diff
Index: linux-20180812-4maxp64/drivers/rtc/rtc-cmos.c
===================================================================
--- linux-20180812-4maxp64.orig/drivers/rtc/rtc-cmos.c
+++ linux-20180812-4maxp64/drivers/rtc/rtc-cmos.c
@@ -167,7 +167,7 @@ static inline int hpet_unregister_irq_ha
 #endif
 
 /* Don't use HPET for RTC Alarm event if ACPI Fixed event is used */
-static int use_hpet_alarm(void)
+static inline int use_hpet_alarm(void)
 {
 	return is_hpet_enabled() && !use_acpi_alarm;
 }

^ permalink raw reply	[flat|nested] 4+ messages in thread

* [PATCH 2/2] rtc: cmos: Remove the `use_acpi_alarm' module parameter for !ACPI
  2018-10-02  1:08 [PATCH 0/2] rtc: cmos: Fix non-ACPI (non-x86) platform support Maciej W. Rozycki
  2018-10-02  1:08 ` [PATCH 1/2] rtc: cmos: Fix non-ACPI undefined reference to `hpet_rtc_interrupt' Maciej W. Rozycki
@ 2018-10-02  1:09 ` Maciej W. Rozycki
  2018-10-04 10:29 ` [PATCH 0/2] rtc: cmos: Fix non-ACPI (non-x86) platform support Alexandre Belloni
  2 siblings, 0 replies; 4+ messages in thread
From: Maciej W. Rozycki @ 2018-10-02  1:09 UTC (permalink / raw)
  To: Alessandro Zummo, Alexandre Belloni; +Cc: linux-rtc, linux-kernel

Fix a problem with commit 311ee9c151ad ("rtc: cmos: allow using ACPI for 
RTC alarm instead of HPET") defining `use_acpi_alarm' module parameter 
even for non-ACPI platforms, which ignore it.  Wrap the definition into 
#ifdef CONFIG_ACPI and use a static inline wrapper function, hardcoded 
to return 0 and consequently optimized away for !ACPI, following the 
existing pattern with HPET handling functions.

Signed-off-by: Maciej W. Rozycki <macro@linux-mips.org>
Fixes: 311ee9c151ad ("rtc: cmos: allow using ACPI for RTC alarm instead of HPET")
Cc: stable@vger.kernel.org # 4.18+
---
 drivers/rtc/rtc-cmos.c |   27 ++++++++++++++++++++-------
 1 file changed, 20 insertions(+), 7 deletions(-)

linux-rtc-cmos-use-acpi-alarm.diff
Index: linux-20180812-4maxp64/drivers/rtc/rtc-cmos.c
===================================================================
--- linux-20180812-4maxp64.orig/drivers/rtc/rtc-cmos.c
+++ linux-20180812-4maxp64/drivers/rtc/rtc-cmos.c
@@ -50,6 +50,7 @@
 /* this is for "generic access to PC-style RTC" using CMOS_READ/CMOS_WRITE */
 #include <linux/mc146818rtc.h>
 
+#ifdef CONFIG_ACPI
 /*
  * Use ACPI SCI to replace HPET interrupt for RTC Alarm event
  *
@@ -61,6 +62,18 @@
 static bool use_acpi_alarm;
 module_param(use_acpi_alarm, bool, 0444);
 
+static inline int cmos_use_acpi_alarm(void)
+{
+	return use_acpi_alarm;
+}
+#else /* !CONFIG_ACPI */
+
+static inline int cmos_use_acpi_alarm(void)
+{
+	return 0;
+}
+#endif
+
 struct cmos_rtc {
 	struct rtc_device	*rtc;
 	struct device		*dev;
@@ -169,7 +182,7 @@ static inline int hpet_unregister_irq_ha
 /* Don't use HPET for RTC Alarm event if ACPI Fixed event is used */
 static inline int use_hpet_alarm(void)
 {
-	return is_hpet_enabled() && !use_acpi_alarm;
+	return is_hpet_enabled() && !cmos_use_acpi_alarm();
 }
 
 /*----------------------------------------------------------------*/
@@ -340,7 +353,7 @@ static void cmos_irq_enable(struct cmos_
 	if (use_hpet_alarm())
 		hpet_set_rtc_irq_bit(mask);
 
-	if ((mask & RTC_AIE) && use_acpi_alarm) {
+	if ((mask & RTC_AIE) && cmos_use_acpi_alarm()) {
 		if (cmos->wake_on)
 			cmos->wake_on(cmos->dev);
 	}
@@ -358,7 +371,7 @@ static void cmos_irq_disable(struct cmos
 	if (use_hpet_alarm())
 		hpet_mask_rtc_irq_bit(mask);
 
-	if ((mask & RTC_AIE) && use_acpi_alarm) {
+	if ((mask & RTC_AIE) && cmos_use_acpi_alarm()) {
 		if (cmos->wake_off)
 			cmos->wake_off(cmos->dev);
 	}
@@ -980,7 +993,7 @@ static int cmos_suspend(struct device *d
 	}
 	spin_unlock_irq(&rtc_lock);
 
-	if ((tmp & RTC_AIE) && !use_acpi_alarm) {
+	if ((tmp & RTC_AIE) && !cmos_use_acpi_alarm()) {
 		cmos->enabled_wake = 1;
 		if (cmos->wake_on)
 			cmos->wake_on(dev);
@@ -1031,7 +1044,7 @@ static void cmos_check_wkalrm(struct dev
 	 * ACPI RTC wake event is cleared after resume from STR,
 	 * ACK the rtc irq here
 	 */
-	if (t_now >= cmos->alarm_expires && use_acpi_alarm) {
+	if (t_now >= cmos->alarm_expires && cmos_use_acpi_alarm()) {
 		cmos_interrupt(0, (void *)cmos->rtc);
 		return;
 	}
@@ -1053,7 +1066,7 @@ static int __maybe_unused cmos_resume(st
 	struct cmos_rtc	*cmos = dev_get_drvdata(dev);
 	unsigned char tmp;
 
-	if (cmos->enabled_wake && !use_acpi_alarm) {
+	if (cmos->enabled_wake && !cmos_use_acpi_alarm()) {
 		if (cmos->wake_off)
 			cmos->wake_off(dev);
 		else
@@ -1132,7 +1145,7 @@ static u32 rtc_handler(void *context)
 	 * Or else, ACPI SCI is enabled during suspend/resume only,
 	 * update rtc irq in that case.
 	 */
-	if (use_acpi_alarm)
+	if (cmos_use_acpi_alarm())
 		cmos_interrupt(0, (void *)cmos->rtc);
 	else {
 		/* Fix me: can we use cmos_interrupt() here as well? */

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH 0/2] rtc: cmos: Fix non-ACPI (non-x86) platform support
  2018-10-02  1:08 [PATCH 0/2] rtc: cmos: Fix non-ACPI (non-x86) platform support Maciej W. Rozycki
  2018-10-02  1:08 ` [PATCH 1/2] rtc: cmos: Fix non-ACPI undefined reference to `hpet_rtc_interrupt' Maciej W. Rozycki
  2018-10-02  1:09 ` [PATCH 2/2] rtc: cmos: Remove the `use_acpi_alarm' module parameter for !ACPI Maciej W. Rozycki
@ 2018-10-04 10:29 ` Alexandre Belloni
  2 siblings, 0 replies; 4+ messages in thread
From: Alexandre Belloni @ 2018-10-04 10:29 UTC (permalink / raw)
  To: Maciej W. Rozycki; +Cc: Alessandro Zummo, linux-rtc, linux-kernel

On 02/10/2018 02:08:37+0100, Maciej W. Rozycki wrote:
> Hi,
> 
>  This mini patch series fixes issues introduced recently for non-ACPI 
> platforms using `rtc-cmos'.  Please see individual change descriptions for 
> details.
> 
>  These have been run-time verified with the DECstation (arch/mips/dec).  
> Please apply.
> 

Both applied, thanks!

>   Maciej

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

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2018-10-04 10:29 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-10-02  1:08 [PATCH 0/2] rtc: cmos: Fix non-ACPI (non-x86) platform support Maciej W. Rozycki
2018-10-02  1:08 ` [PATCH 1/2] rtc: cmos: Fix non-ACPI undefined reference to `hpet_rtc_interrupt' Maciej W. Rozycki
2018-10-02  1:09 ` [PATCH 2/2] rtc: cmos: Remove the `use_acpi_alarm' module parameter for !ACPI Maciej W. Rozycki
2018-10-04 10:29 ` [PATCH 0/2] rtc: cmos: Fix non-ACPI (non-x86) platform support Alexandre Belloni

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.