linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 1/2] x86/platform: add a wallclock_init func to x86_platforms ops
@ 2011-01-25 14:26 Alan Cox
  2011-01-25 14:26 ` [PATCH 2/2] mrst/vrtc: avoid using CMOS RTC ops Alan Cox
  2011-01-25 15:20 ` [PATCH 1/2] x86/platform: add a wallclock_init func to x86_platforms ops Thomas Gleixner
  0 siblings, 2 replies; 6+ messages in thread
From: Alan Cox @ 2011-01-25 14:26 UTC (permalink / raw)
  To: x86, linux-kernel

From: Feng Tang <feng.tang@intel.com>

Some wall clock devices use MMIO based HW register, this new function will
give them a chance to do some initialization work before their get/set_time
service get called.

Signed-off-by: Feng Tang <feng.tang@intel.com>
Signed-off-by: Jacob Pan <jacob.jun.pan@linux.intel.com>
Signed-off-by: Alan Cox <alan@linux.intel.com>
---

 arch/x86/include/asm/x86_init.h |    2 ++
 arch/x86/kernel/setup.c         |    2 ++
 arch/x86/kernel/x86_init.c      |    2 ++
 3 files changed, 6 insertions(+), 0 deletions(-)


diff --git a/arch/x86/include/asm/x86_init.h b/arch/x86/include/asm/x86_init.h
index 64642ad..f7fa2e7 100644
--- a/arch/x86/include/asm/x86_init.h
+++ b/arch/x86/include/asm/x86_init.h
@@ -138,6 +138,7 @@ struct x86_cpuinit_ops {
 /**
  * struct x86_platform_ops - platform specific runtime functions
  * @calibrate_tsc:		calibrate TSC
+ * @wallclock_init:		init the wallclock device
  * @get_wallclock:		get time from HW clock like RTC etc.
  * @set_wallclock:		set time back to HW clock
  * @is_untracked_pat_range	exclude from PAT logic
@@ -146,6 +147,7 @@ struct x86_cpuinit_ops {
  */
 struct x86_platform_ops {
 	unsigned long (*calibrate_tsc)(void);
+	void (*wallclock_init)(void);
 	unsigned long (*get_wallclock)(void);
 	int (*set_wallclock)(unsigned long nowtime);
 	void (*iommu_shutdown)(void);
diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c
index d3cfe26..c204fd5 100644
--- a/arch/x86/kernel/setup.c
+++ b/arch/x86/kernel/setup.c
@@ -1066,6 +1066,8 @@ void __init setup_arch(char **cmdline_p)
 #endif
 	x86_init.oem.banner();
 
+	x86_platform.wallclock_init();
+
 	mcheck_init();
 
 	local_irq_save(flags);
diff --git a/arch/x86/kernel/x86_init.c b/arch/x86/kernel/x86_init.c
index ceb2911..fc3f0e6 100644
--- a/arch/x86/kernel/x86_init.c
+++ b/arch/x86/kernel/x86_init.c
@@ -27,6 +27,7 @@ void __init x86_init_uint_noop(unsigned int unused) { }
 void __init x86_init_pgd_noop(pgd_t *unused) { }
 int __init iommu_init_noop(void) { return 0; }
 void iommu_shutdown_noop(void) { }
+void wallclock_init_noop(void) { }
 
 /*
  * The platform setup functions are preset with the default functions
@@ -92,6 +93,7 @@ static int default_i8042_detect(void) { return 1; };
 
 struct x86_platform_ops x86_platform = {
 	.calibrate_tsc			= native_calibrate_tsc,
+	.wallclock_init			= wallclock_init_noop,
 	.get_wallclock			= mach_get_cmos_time,
 	.set_wallclock			= mach_set_rtc_mmss,
 	.iommu_shutdown			= iommu_shutdown_noop,


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

* [PATCH 2/2] mrst/vrtc: avoid using CMOS RTC ops
  2011-01-25 14:26 [PATCH 1/2] x86/platform: add a wallclock_init func to x86_platforms ops Alan Cox
@ 2011-01-25 14:26 ` Alan Cox
       [not found]   ` <AANLkTi=KQ-5=h-iDPRtBRvy45jafQxxhyJu4UPCxZ6Lg@mail.gmail.com>
  2011-01-25 15:20 ` [PATCH 1/2] x86/platform: add a wallclock_init func to x86_platforms ops Thomas Gleixner
  1 sibling, 1 reply; 6+ messages in thread
From: Alan Cox @ 2011-01-25 14:26 UTC (permalink / raw)
  To: x86, linux-kernel

From: Jacob Pan <jacob.jun.pan@linux.intel.com>

If we don't assign Moorestown specific wallclock init and ops function
the rtc/persisent clock code will use CMOS RTC for access, this will
crash Moorestown as the ioports are not present.
Also in the vrtc driver, we should avoid using CMOS access to check UIP status.

Signed-off-by: Jacob Pan <jacob.jun.pan@linux.intel.com>
Signed-off-by: Alan Cox <alan@linux.intel.com>
---

 arch/x86/platform/mrst/mrst.c |    2 ++
 drivers/rtc/rtc-mrst.c        |   13 ++++++++++++-
 2 files changed, 14 insertions(+), 1 deletions(-)


diff --git a/arch/x86/platform/mrst/mrst.c b/arch/x86/platform/mrst/mrst.c
index ea6529e..dea829c 100644
--- a/arch/x86/platform/mrst/mrst.c
+++ b/arch/x86/platform/mrst/mrst.c
@@ -31,6 +31,7 @@
 #include <asm/apic.h>
 #include <asm/io_apic.h>
 #include <asm/mrst.h>
+#include <asm/mrst-vrtc.h>
 #include <asm/io.h>
 #include <asm/i8259.h>
 #include <asm/intel_scu_ipc.h>
@@ -268,6 +269,7 @@ void __init x86_mrst_early_setup(void)
 
 	x86_platform.calibrate_tsc = mrst_calibrate_tsc;
 	x86_platform.i8042_detect = mrst_i8042_detect;
+	x86_platform.wallclock_init = mrst_rtc_init;
 	x86_init.pci.init = pci_mrst_init;
 	x86_init.pci.fixup_irqs = x86_init_noop;
 
diff --git a/drivers/rtc/rtc-mrst.c b/drivers/rtc/rtc-mrst.c
index bcd0cf6..28e02e7 100644
--- a/drivers/rtc/rtc-mrst.c
+++ b/drivers/rtc/rtc-mrst.c
@@ -62,6 +62,17 @@ static inline int is_intr(u8 rtc_intr)
 	return rtc_intr & RTC_IRQMASK;
 }
 
+static inline unsigned char vrtc_is_updating(void)
+{
+	unsigned char uip;
+	unsigned long flags;
+
+	spin_lock_irqsave(&rtc_lock, flags);
+	uip = (vrtc_cmos_read(RTC_FREQ_SELECT) & RTC_UIP);
+	spin_unlock_irqrestore(&rtc_lock, flags);
+	return uip;
+}
+
 /*
  * rtc_time's year contains the increment over 1900, but vRTC's YEAR
  * register can't be programmed to value larger than 0x64, so vRTC
@@ -76,7 +87,7 @@ static int mrst_read_time(struct device *dev, struct rtc_time *time)
 {
 	unsigned long flags;
 
-	if (rtc_is_updating())
+	if (vrtc_is_updating())
 		mdelay(20);
 
 	spin_lock_irqsave(&rtc_lock, flags);


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

* Re: [PATCH 1/2] x86/platform: add a wallclock_init func to x86_platforms ops
  2011-01-25 14:26 [PATCH 1/2] x86/platform: add a wallclock_init func to x86_platforms ops Alan Cox
  2011-01-25 14:26 ` [PATCH 2/2] mrst/vrtc: avoid using CMOS RTC ops Alan Cox
@ 2011-01-25 15:20 ` Thomas Gleixner
  1 sibling, 0 replies; 6+ messages in thread
From: Thomas Gleixner @ 2011-01-25 15:20 UTC (permalink / raw)
  To: Alan Cox; +Cc: x86, linux-kernel

On Tue, 25 Jan 2011, Alan Cox wrote:

> From: Feng Tang <feng.tang@intel.com>
> 
> Some wall clock devices use MMIO based HW register, this new function will
> give them a chance to do some initialization work before their get/set_time
> service get called.
> 
> Signed-off-by: Feng Tang <feng.tang@intel.com>
> Signed-off-by: Jacob Pan <jacob.jun.pan@linux.intel.com>
> Signed-off-by: Alan Cox <alan@linux.intel.com>
> ---
> 
>  arch/x86/include/asm/x86_init.h |    2 ++
>  arch/x86/kernel/setup.c         |    2 ++
>  arch/x86/kernel/x86_init.c      |    2 ++
>  3 files changed, 6 insertions(+), 0 deletions(-)
> 
> 
> diff --git a/arch/x86/include/asm/x86_init.h b/arch/x86/include/asm/x86_init.h
> index 64642ad..f7fa2e7 100644
> --- a/arch/x86/include/asm/x86_init.h
> +++ b/arch/x86/include/asm/x86_init.h
> @@ -138,6 +138,7 @@ struct x86_cpuinit_ops {
>  /**
>   * struct x86_platform_ops - platform specific runtime functions
>   * @calibrate_tsc:		calibrate TSC
> + * @wallclock_init:		init the wallclock device

That's a one time called init function, so it should go into
x86_init_ops.

Thanks,

	tglx

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

* Re: [PATCH 2/2] mrst/vrtc: avoid using CMOS RTC ops
       [not found]   ` <AANLkTi=KQ-5=h-iDPRtBRvy45jafQxxhyJu4UPCxZ6Lg@mail.gmail.com>
@ 2011-01-27  1:50     ` Feng Tang
  0 siblings, 0 replies; 6+ messages in thread
From: Feng Tang @ 2011-01-27  1:50 UTC (permalink / raw)
  To: alan, x86, linux-kernel; +Cc: jacob.jun.pan


> From: Alan Cox <alan@lxorguk.ukuu.org.uk>
> Date: 2011/1/25
> Subject: [PATCH 2/2] mrst/vrtc: avoid using CMOS RTC ops
> To: x86@kernel.org, linux-kernel@vger.kernel.org
> 
> 
> From: Jacob Pan <jacob.jun.pan@linux.intel.com>
> 
> If we don't assign Moorestown specific wallclock init and ops function
> the rtc/persisent clock code will use CMOS RTC for access, this will
> crash Moorestown as the ioports are not present.
> Also in the vrtc driver, we should avoid using CMOS access to check
> UIP status.
> 
> Signed-off-by: Jacob Pan <jacob.jun.pan@linux.intel.com>
> Signed-off-by: Alan Cox <alan@linux.intel.com>
> ---

Hi,

Here is the updated version, following the change of moving the
wallclock_init() to x86_init.timers.

Thanks,
Feng
-----------------

>From f1b25a39a11a34036db625c8fb4e5a6a0acfa56d Mon Sep 17 00:00:00 2001
From: Feng Tang <feng.tang@intel.com>
Date: Thu, 27 Jan 2011 09:39:08 +0800
Subject: [PATCH] mrst/vrtc: avoid using cmos rtc ops

If we don't assign Moorestown specific wallclock init and ops function
the rtc/persisent clock code will use cmos rtc for access, this will
crash Moorestown in that the ioports are not present.

Also in vrtc driver, should avoid using cmos access to check UIP status.

[feng.tang@intel.com: use set_fixmap_offset_nocache() to simplify code]
Signed-off-by: Jacob Pan <jacob.jun.pan@linux.intel.com>
Signed-off-by: Feng Tang <feng.tang@intel.com>
Signed-off-by: Alan Cox <alan@linux.intel.com>
---
 arch/x86/platform/mrst/mrst.c |    2 ++
 arch/x86/platform/mrst/vrtc.c |   15 ++++-----------
 drivers/rtc/rtc-mrst.c        |   13 ++++++++++++-
 3 files changed, 18 insertions(+), 12 deletions(-)

diff --git a/arch/x86/platform/mrst/mrst.c b/arch/x86/platform/mrst/mrst.c
index ea6529e..5c0207b 100644
--- a/arch/x86/platform/mrst/mrst.c
+++ b/arch/x86/platform/mrst/mrst.c
@@ -31,6 +31,7 @@
 #include <asm/apic.h>
 #include <asm/io_apic.h>
 #include <asm/mrst.h>
+#include <asm/mrst-vrtc.h>
 #include <asm/io.h>
 #include <asm/i8259.h>
 #include <asm/intel_scu_ipc.h>
@@ -268,6 +269,7 @@ void __init x86_mrst_early_setup(void)
 
 	x86_platform.calibrate_tsc = mrst_calibrate_tsc;
 	x86_platform.i8042_detect = mrst_i8042_detect;
+	x86_init.timers.wallclock_init = mrst_rtc_init;
 	x86_init.pci.init = pci_mrst_init;
 	x86_init.pci.fixup_irqs = x86_init_noop;
 
diff --git a/arch/x86/platform/mrst/vrtc.c b/arch/x86/platform/mrst/vrtc.c
index 32cd7ed..f6f34c5 100644
--- a/arch/x86/platform/mrst/vrtc.c
+++ b/arch/x86/platform/mrst/vrtc.c
@@ -100,21 +100,14 @@ int vrtc_set_mmss(unsigned long nowtime)
 
 void __init mrst_rtc_init(void)
 {
-	unsigned long rtc_paddr;
-	void __iomem *virt_base;
+	unsigned long vrtc_paddr = sfi_mrtc_array[0].phys_addr;
 
 	sfi_table_parse(SFI_SIG_MRTC, NULL, NULL, sfi_parse_mrtc);
-	if (!sfi_mrtc_num)
+	if (!sfi_mrtc_num || !vrtc_paddr)
 		return;
 
-	rtc_paddr = sfi_mrtc_array[0].phys_addr;
-
-	/* vRTC's register address may not be page aligned */
-	set_fixmap_nocache(FIX_LNW_VRTC, rtc_paddr);
-
-	virt_base = (void __iomem *)__fix_to_virt(FIX_LNW_VRTC);
-	virt_base += rtc_paddr & ~PAGE_MASK;
-	vrtc_virt_base = virt_base;
+	vrtc_virt_base = (void __iomem *)set_fixmap_offset_nocache(FIX_LNW_VRTC,
+								vrtc_paddr);
 
 	x86_platform.get_wallclock = vrtc_get_time;
 	x86_platform.set_wallclock = vrtc_set_mmss;
diff --git a/drivers/rtc/rtc-mrst.c b/drivers/rtc/rtc-mrst.c
index bcd0cf6..28e02e7 100644
--- a/drivers/rtc/rtc-mrst.c
+++ b/drivers/rtc/rtc-mrst.c
@@ -62,6 +62,17 @@ static inline int is_intr(u8 rtc_intr)
 	return rtc_intr & RTC_IRQMASK;
 }
 
+static inline unsigned char vrtc_is_updating(void)
+{
+	unsigned char uip;
+	unsigned long flags;
+
+	spin_lock_irqsave(&rtc_lock, flags);
+	uip = (vrtc_cmos_read(RTC_FREQ_SELECT) & RTC_UIP);
+	spin_unlock_irqrestore(&rtc_lock, flags);
+	return uip;
+}
+
 /*
  * rtc_time's year contains the increment over 1900, but vRTC's YEAR
  * register can't be programmed to value larger than 0x64, so vRTC
@@ -76,7 +87,7 @@ static int mrst_read_time(struct device *dev, struct rtc_time *time)
 {
 	unsigned long flags;
 
-	if (rtc_is_updating())
+	if (vrtc_is_updating())
 		mdelay(20);
 
 	spin_lock_irqsave(&rtc_lock, flags);
-- 
1.7.0.4

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

* Re: [PATCH 1/2] x86/platform: add a wallclock_init func to x86_platforms ops
  2011-01-26  3:03 ` Feng Tang
@ 2011-01-26 12:26   ` Thomas Gleixner
  0 siblings, 0 replies; 6+ messages in thread
From: Thomas Gleixner @ 2011-01-26 12:26 UTC (permalink / raw)
  To: Feng Tang; +Cc: Alan Cox, x86, linux-kernel

On Wed, 26 Jan 2011, Feng Tang wrote:
> Hi Thomas,
> 
> Here is the updated one, if you think it's ok, I'll update the second patch later.

Looks good. Thanks,

      tglx

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

* Re: [PATCH 1/2] x86/platform: add a wallclock_init func to x86_platforms ops
       [not found] <20110125153813.4aa1e7cc@lxorguk.ukuu.org.uk>
@ 2011-01-26  3:03 ` Feng Tang
  2011-01-26 12:26   ` Thomas Gleixner
  0 siblings, 1 reply; 6+ messages in thread
From: Feng Tang @ 2011-01-26  3:03 UTC (permalink / raw)
  To: tglx, Alan Cox; +Cc: x86, linux-kernel


> Date: Tue, 25 Jan 2011 16:20:17 +0100 (CET)
> From: Thomas Gleixner <tglx@linutronix.de>
> To: Alan Cox <alan@lxorguk.ukuu.org.uk>
> Cc: x86@kernel.org, linux-kernel@vger.kernel.org
> Subject: Re: [PATCH 1/2] x86/platform: add a wallclock_init func to
> x86_platforms ops
> 
> 
> On Tue, 25 Jan 2011, Alan Cox wrote:
> 
> > From: Feng Tang <feng.tang@intel.com>
> > 
> > Some wall clock devices use MMIO based HW register, this new
> > function will give them a chance to do some initialization work
> > before their get/set_time service get called.
> > 
> > Signed-off-by: Feng Tang <feng.tang@intel.com>
> > Signed-off-by: Jacob Pan <jacob.jun.pan@linux.intel.com>
> > Signed-off-by: Alan Cox <alan@linux.intel.com>
> > ---
> > 
> >  arch/x86/include/asm/x86_init.h |    2 ++
> >  arch/x86/kernel/setup.c         |    2 ++
> >  arch/x86/kernel/x86_init.c      |    2 ++
> >  3 files changed, 6 insertions(+), 0 deletions(-)
> > 
> > 
> > diff --git a/arch/x86/include/asm/x86_init.h
> > b/arch/x86/include/asm/x86_init.h index 64642ad..f7fa2e7 100644
> > --- a/arch/x86/include/asm/x86_init.h
> > +++ b/arch/x86/include/asm/x86_init.h
> > @@ -138,6 +138,7 @@ struct x86_cpuinit_ops {
> >  /**
> >   * struct x86_platform_ops - platform specific runtime functions
> >   * @calibrate_tsc:		calibrate TSC
> > + * @wallclock_init:		init the wallclock device
> 
> That's a one time called init function, so it should go into
> x86_init_ops.
> 
> Thanks,
> 
> 	tglx
> 

Hi Thomas,

Here is the updated one, if you think it's ok, I'll update the second patch later.

Thanks,
Feng
-------------

>From b305dc1ae5db882ac8ab49248096f96dd16bdd9a Mon Sep 17 00:00:00 2001
From: Feng Tang <feng.tang@intel.com>
Date: Wed, 26 Jan 2011 10:41:25 +0800
Subject: [PATCH] x86/platform: add a wallclock_init func to x86_init.timers ops

Some wall clock devices use MMIO based HW register, this new
function will give them a chance to do some initialization work
before their get/set_time service get called, which is usually
called in early kernel boot phase.

Signed-off-by: Feng Tang <feng.tang@intel.com>
Signed-off-by: Jacob Pan <jacob.jun.pan@linux.intel.com>
Signed-off-by: Alan Cox <alan@linux.intel.com>
---
 arch/x86/include/asm/x86_init.h |    2 ++
 arch/x86/kernel/setup.c         |    2 ++
 arch/x86/kernel/x86_init.c      |    1 +
 3 files changed, 5 insertions(+), 0 deletions(-)

diff --git a/arch/x86/include/asm/x86_init.h b/arch/x86/include/asm/x86_init.h
index 64642ad..643ebf2 100644
--- a/arch/x86/include/asm/x86_init.h
+++ b/arch/x86/include/asm/x86_init.h
@@ -83,11 +83,13 @@ struct x86_init_paging {
  *				boot cpu
  * @tsc_pre_init:		platform function called before TSC init
  * @timer_init:			initialize the platform timer (default PIT/HPET)
+ * @wallclock_init:		init the wallclock device
  */
 struct x86_init_timers {
 	void (*setup_percpu_clockev)(void);
 	void (*tsc_pre_init)(void);
 	void (*timer_init)(void);
+	void (*wallclock_init)(void);
 };
 
 /**
diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c
index a25ce88..8b1cd72 100644
--- a/arch/x86/kernel/setup.c
+++ b/arch/x86/kernel/setup.c
@@ -1066,6 +1066,8 @@ void __init setup_arch(char **cmdline_p)
 #endif
 	x86_init.oem.banner();
 
+	x86_init.timers.wallclock_init();
+
 	mcheck_init();
 
 	local_irq_save(flags);
diff --git a/arch/x86/kernel/x86_init.c b/arch/x86/kernel/x86_init.c
index ceb2911..c11514e 100644
--- a/arch/x86/kernel/x86_init.c
+++ b/arch/x86/kernel/x86_init.c
@@ -70,6 +70,7 @@ struct x86_init_ops x86_init __initdata = {
 		.setup_percpu_clockev	= setup_boot_APIC_clock,
 		.tsc_pre_init		= x86_init_noop,
 		.timer_init		= hpet_time_init,
+		.wallclock_init		= x86_init_noop,
 	},
 
 	.iommu = {
-- 
1.7.0.4




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

end of thread, other threads:[~2011-01-27  1:50 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-01-25 14:26 [PATCH 1/2] x86/platform: add a wallclock_init func to x86_platforms ops Alan Cox
2011-01-25 14:26 ` [PATCH 2/2] mrst/vrtc: avoid using CMOS RTC ops Alan Cox
     [not found]   ` <AANLkTi=KQ-5=h-iDPRtBRvy45jafQxxhyJu4UPCxZ6Lg@mail.gmail.com>
2011-01-27  1:50     ` Feng Tang
2011-01-25 15:20 ` [PATCH 1/2] x86/platform: add a wallclock_init func to x86_platforms ops Thomas Gleixner
     [not found] <20110125153813.4aa1e7cc@lxorguk.ukuu.org.uk>
2011-01-26  3:03 ` Feng Tang
2011-01-26 12:26   ` Thomas Gleixner

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).