All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v3 0/1] x86/init: Add option to skip using RTC
@ 2019-10-10  9:28 Rahul Tanwar
  2019-10-10  9:28 ` [PATCH v3 1/1] x86/init: Noop get/set wallclock when platform doesn't support RTC Rahul Tanwar
  0 siblings, 1 reply; 2+ messages in thread
From: Rahul Tanwar @ 2019-10-10  9:28 UTC (permalink / raw)
  To: tglx, mingo, bp, hpa, tony.luck, x86
  Cc: andriy.shevchenko, alan, linux-kernel, qi-ming.wu, chuanhua.lei,
	cheol.yong.kim, Rahul Tanwar

Hi,

We have a new Atom Airmont core based product which does not support
RTC as persistent clock source.

Presently, platform ops get/set wallclock always use MC146818 RTC/CMOS
device to read & set time. This causes boot failure on our SOC with no
RTC. More specifically, it hangs in RTC driver's mach_get_cmos_time() 
when it polls RTC_FRQ_SELECT register and loops until Update-In-Progress
(UIP) flag gets cleared i.e. below code snippet.

 	while ((CMOS_READ(RTC_FREQ_SELECT) & RTC_UIP))
		cpu_relax();

After few rounds of review cycles/feedback, we concluded that we should
control it from Motorola MC146818 compatible RTC devicetree node.
Please see [1].

Make RTC read/write optional by detecting platforms which does not
support RTC/CMOS device through the corresponding DT node status
property. If status says disabled, then noop the get/set wallclock
ops.

For non DT enabled platforms or for DT enabled platforms which does
not define optional status property, proceed same as before.

Patch is baselined upon Linux 5.4-rc2 at below Git tree:
git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git x86/core

[1] Documentation/devicetree/bindings/rtc/rtc-cmos.txt

v3:
* Rebase to latest 5.4-rc2 kernel.
* Fix a build warning reported by kbuild test robot.

v2:
* As per review feedback, do not hack RTC read/write functions directly. 
  Instead, override get/set wallclock ops during setup_arch init sequence.

v1:
* Detect platforms with no RTC in RTC read/write functions and skip RTC
  read/write if not applicable.


Rahul Tanwar (1):
  x86/init: Noop get/set wallclock when platform doesn't support RTC

 arch/x86/kernel/x86_init.c | 26 +++++++++++++++++++++++++-
 1 file changed, 25 insertions(+), 1 deletion(-)

-- 
2.11.0


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

* [PATCH v3 1/1] x86/init: Noop get/set wallclock when platform doesn't support RTC
  2019-10-10  9:28 [PATCH v3 0/1] x86/init: Add option to skip using RTC Rahul Tanwar
@ 2019-10-10  9:28 ` Rahul Tanwar
  0 siblings, 0 replies; 2+ messages in thread
From: Rahul Tanwar @ 2019-10-10  9:28 UTC (permalink / raw)
  To: tglx, mingo, bp, hpa, tony.luck, x86
  Cc: andriy.shevchenko, alan, linux-kernel, qi-ming.wu, chuanhua.lei,
	cheol.yong.kim, Rahul Tanwar

Use wallclock_init() op to detect platforms which does not support RTC and
noop get/set wallclock ops for such platforms.

Suggested-by: Andy Shevchenko <andriy.shevchenko@intel.com>
Signed-off-by: Rahul Tanwar <rahul.tanwar@linux.intel.com>
---
 arch/x86/kernel/x86_init.c | 26 +++++++++++++++++++++++++-
 1 file changed, 25 insertions(+), 1 deletion(-)

diff --git a/arch/x86/kernel/x86_init.c b/arch/x86/kernel/x86_init.c
index 18a799c8fa28..4f572fd942eb 100644
--- a/arch/x86/kernel/x86_init.c
+++ b/arch/x86/kernel/x86_init.c
@@ -31,6 +31,30 @@ static int __init iommu_init_noop(void) { return 0; }
 static void iommu_shutdown_noop(void) { }
 bool __init bool_x86_init_noop(void) { return false; }
 void x86_op_int_noop(int cpu) { }
+static int set_rtc_noop(const struct timespec64 *now) { return -EINVAL; }
+static void get_rtc_noop(struct timespec64 *now) { }
+
+static const struct of_device_id of_cmos_match[] = {
+	{ .compatible = "motorola,mc146818" },
+	{}
+};
+
+static void x86_wallclock_init(void)
+{
+	struct device_node *node;
+
+	node = of_find_matching_node(NULL, of_cmos_match);
+	if (node && !of_device_is_available(node)) {
+		/*
+		 * Some products do not support RTC as persistent clock source. This can be
+		 * optionally indicated by having status property as disabled in the
+		 * corresponding DT node. Override get/set wallclock routines to noops for
+		 * such products.
+		 */
+		x86_platform.get_wallclock = get_rtc_noop;
+		x86_platform.set_wallclock = set_rtc_noop;
+	}
+}
 
 /*
  * The platform setup functions are preset with the default functions
@@ -73,7 +97,7 @@ struct x86_init_ops x86_init __initdata = {
 	.timers = {
 		.setup_percpu_clockev	= setup_boot_APIC_clock,
 		.timer_init		= hpet_time_init,
-		.wallclock_init		= x86_init_noop,
+		.wallclock_init		= x86_wallclock_init,
 	},
 
 	.iommu = {
-- 
2.11.0


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

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

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2019-10-10  9:28 [PATCH v3 0/1] x86/init: Add option to skip using RTC Rahul Tanwar
2019-10-10  9:28 ` [PATCH v3 1/1] x86/init: Noop get/set wallclock when platform doesn't support RTC Rahul Tanwar

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.