Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756271AbcDGM54 (ORCPT ); Thu, 7 Apr 2016 08:57:56 -0400 Received: from aserp1040.oracle.com ([141.146.126.69]:30871 "EHLO aserp1040.oracle.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753962AbcDGM5y (ORCPT ); Thu, 7 Apr 2016 08:57:54 -0400 Subject: Re: [PATCH v4 04/14] x86/rtc: replace paravirt rtc check with platform legacy quirk To: "Luis R. Rodriguez" , bp@alien8.de, hpa@zytor.com, tglx@linutronix.de, mingo@redhat.com, rusty@rustcorp.com.au References: <1459987594-5434-1-git-send-email-mcgrof@kernel.org> <1459987594-5434-5-git-send-email-mcgrof@kernel.org> Cc: x86@kernel.org, linux-kernel@vger.kernel.org, luto@amacapital.net, david.vrabel@citrix.com, konrad.wilk@oracle.com, xen-devel@lists.xensource.com, lguest@lists.ozlabs.org, andriy.shevchenko@linux.intel.com, jlee@suse.com, glin@suse.com, matt@codeblueprint.co.uk, andrew.cooper3@citrix.com From: Boris Ostrovsky Message-ID: <570658DA.7060509@oracle.com> Date: Thu, 7 Apr 2016 08:55:54 -0400 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.1.0 MIME-Version: 1.0 In-Reply-To: <1459987594-5434-5-git-send-email-mcgrof@kernel.org> Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit X-Source-IP: userv0021.oracle.com [156.151.31.71] Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 7978 Lines: 230 On 04/06/2016 08:06 PM, Luis R. Rodriguez wrote: > We have 4 types of x86 platforms that disable RTC: > > * Intel MID > * Lguest - uses paravirt > * Xen dom-U - uses paravirt > * x86 on legacy systems annotated with an ACPI legacy flag > > We can consolidate all of these into a platform specific legacy > quirk set early in boot through i386_start_kernel() and through > x86_64_start_reservations(). This deals with the RTC quirks which > we can rely on through the hardware subarch, the ACPI check can > be dealt with separately. > > v2: split the subarch check from the ACPI check, clarify > on the ACPI change commit log why ordering works > > Suggested-by: Ingo Molnar > Signed-off-by: Luis R. Rodriguez > --- > arch/x86/Makefile | 1 + > arch/x86/include/asm/paravirt.h | 6 ------ > arch/x86/include/asm/paravirt_types.h | 5 ----- > arch/x86/include/asm/processor.h | 1 - > arch/x86/include/asm/x86_init.h | 13 +++++++++++++ > arch/x86/kernel/Makefile | 6 +++++- > arch/x86/kernel/head32.c | 2 ++ > arch/x86/kernel/head64.c | 1 + > arch/x86/kernel/platform-quirks.c | 18 ++++++++++++++++++ > arch/x86/kernel/rtc.c | 7 ++----- > arch/x86/lguest/boot.c | 1 - > arch/x86/xen/enlighten.c | 3 --- > 12 files changed, 42 insertions(+), 22 deletions(-) > create mode 100644 arch/x86/kernel/platform-quirks.c > > diff --git a/arch/x86/Makefile b/arch/x86/Makefile > index 4086abca0b32..f9ed8a7ce2b6 100644 > --- a/arch/x86/Makefile > +++ b/arch/x86/Makefile > @@ -209,6 +209,7 @@ endif > head-y := arch/x86/kernel/head_$(BITS).o > head-y += arch/x86/kernel/head$(BITS).o > head-y += arch/x86/kernel/head.o > +head-y += arch/x86/kernel/platform-quirks.o > > libs-y += arch/x86/lib/ > > diff --git a/arch/x86/include/asm/paravirt.h b/arch/x86/include/asm/paravirt.h > index 601f1b8f9961..6c7a4a192032 100644 > --- a/arch/x86/include/asm/paravirt.h > +++ b/arch/x86/include/asm/paravirt.h > @@ -20,12 +20,6 @@ static inline int paravirt_enabled(void) > return pv_info.paravirt_enabled; > } > > -static inline int paravirt_has_feature(unsigned int feature) > -{ > - WARN_ON_ONCE(!pv_info.paravirt_enabled); > - return (pv_info.features & feature); > -} > - > static inline void load_sp0(struct tss_struct *tss, > struct thread_struct *thread) > { > diff --git a/arch/x86/include/asm/paravirt_types.h b/arch/x86/include/asm/paravirt_types.h > index e8c2326478c8..6acc1b26cf40 100644 > --- a/arch/x86/include/asm/paravirt_types.h > +++ b/arch/x86/include/asm/paravirt_types.h > @@ -70,14 +70,9 @@ struct pv_info { > #endif > > int paravirt_enabled; > - unsigned int features; /* valid only if paravirt_enabled is set */ > const char *name; > }; > > -#define paravirt_has(x) paravirt_has_feature(PV_SUPPORTED_##x) > -/* Supported features */ > -#define PV_SUPPORTED_RTC (1<<0) > - > struct pv_init_ops { > /* > * Patch may replace one of the defined code sequences with > diff --git a/arch/x86/include/asm/processor.h b/arch/x86/include/asm/processor.h > index 9264476f3d57..0c70c7daa6b8 100644 > --- a/arch/x86/include/asm/processor.h > +++ b/arch/x86/include/asm/processor.h > @@ -474,7 +474,6 @@ static inline unsigned long current_top_of_stack(void) > #else > #define __cpuid native_cpuid > #define paravirt_enabled() 0 > -#define paravirt_has(x) 0 > > static inline void load_sp0(struct tss_struct *tss, > struct thread_struct *thread) > diff --git a/arch/x86/include/asm/x86_init.h b/arch/x86/include/asm/x86_init.h > index 1ae89a2721d6..27d5c3fe5198 100644 > --- a/arch/x86/include/asm/x86_init.h > +++ b/arch/x86/include/asm/x86_init.h > @@ -142,6 +142,15 @@ struct x86_cpuinit_ops { > struct timespec; > > /** > + * struct x86_legacy_features - legacy x86 features > + * > + * @rtc: this device has a CMOS real-time clock present > + */ > +struct x86_legacy_features { > + int rtc; > +}; > + > +/** > * struct x86_platform_ops - platform specific runtime functions > * @calibrate_tsc: calibrate TSC > * @get_wallclock: get time from HW clock like RTC etc. > @@ -152,6 +161,7 @@ struct timespec; > * @save_sched_clock_state: save state for sched_clock() on suspend > * @restore_sched_clock_state: restore state for sched_clock() on resume > * @apic_post_init: adjust apic if neeeded > + * @legacy: legacy features > */ > struct x86_platform_ops { > unsigned long (*calibrate_tsc)(void); > @@ -165,6 +175,7 @@ struct x86_platform_ops { > void (*save_sched_clock_state)(void); > void (*restore_sched_clock_state)(void); > void (*apic_post_init)(void); > + struct x86_legacy_features legacy; > }; > > struct pci_dev; > @@ -186,6 +197,8 @@ extern struct x86_cpuinit_ops x86_cpuinit; > extern struct x86_platform_ops x86_platform; > extern struct x86_msi_ops x86_msi; > extern struct x86_io_apic_ops x86_io_apic_ops; > + > +extern void x86_early_init_platform_quirks(void); > extern void x86_init_noop(void); > extern void x86_init_uint_noop(unsigned int unused); > > diff --git a/arch/x86/kernel/Makefile b/arch/x86/kernel/Makefile > index 89f8ade0bc7c..7a9e44d935de 100644 > --- a/arch/x86/kernel/Makefile > +++ b/arch/x86/kernel/Makefile > @@ -2,7 +2,11 @@ > # Makefile for the linux kernel. > # > > -extra-y := head_$(BITS).o head$(BITS).o head.o vmlinux.lds > +extra-y := head_$(BITS).o > +extra-y += head$(BITS).o > +extra-y += head.o > +extra-y += platform-quirks.o > +extra-y += vmlinux.lds > > CPPFLAGS_vmlinux.lds += -U$(UTS_MACHINE) > > diff --git a/arch/x86/kernel/head32.c b/arch/x86/kernel/head32.c > index 2911ef3a9f1c..d784bb547a9d 100644 > --- a/arch/x86/kernel/head32.c > +++ b/arch/x86/kernel/head32.c > @@ -34,6 +34,8 @@ asmlinkage __visible void __init i386_start_kernel(void) > cr4_init_shadow(); > sanitize_boot_params(&boot_params); > > + x86_early_init_platform_quirks(); > + > /* Call the subarch specific early setup function */ > switch (boot_params.hdr.hardware_subarch) { > case X86_SUBARCH_INTEL_MID: > diff --git a/arch/x86/kernel/head64.c b/arch/x86/kernel/head64.c > index 1f4422d5c8d0..b72fb0b71dd1 100644 > --- a/arch/x86/kernel/head64.c > +++ b/arch/x86/kernel/head64.c > @@ -182,6 +182,7 @@ void __init x86_64_start_reservations(char *real_mode_data) > if (!boot_params.hdr.version) > copy_bootdata(__va(real_mode_data)); > > + x86_early_init_platform_quirks(); > reserve_ebda_region(); > > switch (boot_params.hdr.hardware_subarch) { > diff --git a/arch/x86/kernel/platform-quirks.c b/arch/x86/kernel/platform-quirks.c > new file mode 100644 > index 000000000000..1b114ac5996f > --- /dev/null > +++ b/arch/x86/kernel/platform-quirks.c > @@ -0,0 +1,18 @@ > +#include > +#include > + > +#include > +#include > + > +void __init x86_early_init_platform_quirks(void) > +{ > + x86_platform.legacy.rtc = 1; > + > + switch (boot_params.hdr.hardware_subarch) { > + case X86_SUBARCH_XEN: > + case X86_SUBARCH_LGUEST: > + case X86_SUBARCH_INTEL_MID: > + x86_platform.legacy.rtc = 0; > + break; > + } > +} What about Xen dom0 (aka initial domain)? -boris > --- a/arch/x86/xen/enlighten.c > +++ b/arch/x86/xen/enlighten.c > @@ -1192,7 +1192,6 @@ static const struct pv_info xen_info __initconst = { > #ifdef CONFIG_X86_64 > .extra_user_64bit_cs = FLAT_USER_CS64, > #endif > - .features = 0, > .name = "Xen", > }; > > @@ -1525,8 +1524,6 @@ asmlinkage __visible void __init xen_start_kernel(void) > > /* Install Xen paravirt ops */ > pv_info = xen_info; > - if (xen_initial_domain()) > - pv_info.features |= PV_SUPPORTED_RTC; > pv_init_ops = xen_init_ops; > if (!xen_pvh_domain()) { > pv_cpu_ops = xen_cpu_ops;