Wei, Gang
2008-Jul-16 05:52 UTC
[Xen-devel] [PATCH]Add option hpetbroadcast to force enabling hpet_broadcast
Add option hpetbroadcast to force enabling hpet_broadcast. This option can be used for test & experiment purpose. Signed-off-by: Wei Gang <gang.wei@intel.com> diff -r e7d4c937c92e xen/arch/x86/time.c --- a/xen/arch/x86/time.c Wed Jul 16 11:04:41 2008 +0800 +++ b/xen/arch/x86/time.c Wed Jul 16 11:33:56 2008 +0800 @@ -1035,21 +1035,36 @@ void __init early_time_init(void) setup_irq(0, &irq0); } +/* force_hpet_broadcast: if true, force using hpet_broadcast to fix lapic stop + issue for deep C state with pit disabled */ +static int force_hpet_broadcast; +boolean_param("hpetbroadcast", force_hpet_broadcast); + /* keep pit enabled for pit_broadcast working while cpuidle enabled */ static int disable_pit_irq(void) { - if ( !using_pit && cpu_has_apic && !xen_cpuidle ) + if ( !using_pit && cpu_has_apic && (!xen_cpuidle || force_hpet_broadcast) ) { - /* Disable PIT CH0 timer interrupt. */ - outb_p(0x30, PIT_MODE); - outb_p(0, PIT_CH0); - outb_p(0, PIT_CH0); - /* * If we do not rely on PIT CH0 then we can use HPET for one-shot * timer emulation when entering deep C states. */ - /*hpet_broadcast_init(); XXX dom0 may rely on RTC interrupt delivery */ + /* XXX dom0 may rely on RTC interrupt delivery, so only enable + hpet_broadcast if force_hpet_broadcast */ + if ( xen_cpuidle && force_hpet_broadcast ) + { + hpet_broadcast_init(); + if ( !hpet_broadcast_is_available() ) + { + printk("HPET broadcast init failed, fall back to PIT broadcast.\n"); + return 0; + } + } + + /* Disable PIT CH0 timer interrupt. */ + outb_p(0x30, PIT_MODE); + outb_p(0, PIT_CH0); + outb_p(0, PIT_CH0); } return 0; _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Wei, Gang
2008-Jul-16 08:34 UTC
RE: [Xen-devel] [PATCH]Add option hpetbroadcast to force enablinghpet_broadcast
Resend as attachment. Jimmy On Wednesday, July 16, 2008 1:52 PM, Wei, Gang wrote:> Add option hpetbroadcast to force enabling hpet_broadcast. > > This option can be used for test & experiment purpose. > > Signed-off-by: Wei Gang <gang.wei@intel.com> > > diff -r e7d4c937c92e xen/arch/x86/time.c > --- a/xen/arch/x86/time.c Wed Jul 16 11:04:41 2008 +0800 > +++ b/xen/arch/x86/time.c Wed Jul 16 11:33:56 2008 +0800 > @@ -1035,21 +1035,36 @@ void __init early_time_init(void) > setup_irq(0, &irq0); > } > > +/* force_hpet_broadcast: if true, force using hpet_broadcast to fix > lapic stop > + issue for deep C state with pit disabled */ > +static int force_hpet_broadcast; > +boolean_param("hpetbroadcast", force_hpet_broadcast); > + > /* keep pit enabled for pit_broadcast working while cpuidle enabled*/> static int disable_pit_irq(void) > { > - if ( !using_pit && cpu_has_apic && !xen_cpuidle ) > + if ( !using_pit && cpu_has_apic && (!xen_cpuidle || > force_hpet_broadcast) ) > { > - /* Disable PIT CH0 timer interrupt. */ > - outb_p(0x30, PIT_MODE); > - outb_p(0, PIT_CH0); > - outb_p(0, PIT_CH0); > - > /* > * If we do not rely on PIT CH0 then we can use HPET for > one-shot > * timer emulation when entering deep C states. > */ > - /*hpet_broadcast_init(); XXX dom0 may rely on RTC interrupt > delivery */ > + /* XXX dom0 may rely on RTC interrupt delivery, so onlyenable> + hpet_broadcast if force_hpet_broadcast */ > + if ( xen_cpuidle && force_hpet_broadcast ) > + { > + hpet_broadcast_init(); > + if ( !hpet_broadcast_is_available() ) > + { > + printk("HPET broadcast init failed, fall back to PIT > broadcast.\n"); > + return 0; > + } > + } > + > + /* Disable PIT CH0 timer interrupt. */ > + outb_p(0x30, PIT_MODE); > + outb_p(0, PIT_CH0); > + outb_p(0, PIT_CH0); > } > > return 0; > > _______________________________________________ > Xen-devel mailing list > Xen-devel@lists.xensource.com > http://lists.xensource.com/xen-devel_______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel