[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [RFC 4/8] x86/hpet: Debug and verbose hpet logging
This was for debugging purposes, but might perhaps be more useful generally. I am happy to keep none, some or all of it, depending on how useful people think it might be. Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> CC: Keir Fraser <keir@xxxxxxx> CC: Jan Beulich <JBeulich@xxxxxxxx> --- xen/arch/x86/hpet.c | 83 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) diff --git a/xen/arch/x86/hpet.c b/xen/arch/x86/hpet.c index 091e624..4b08381 100644 --- a/xen/arch/x86/hpet.c +++ b/xen/arch/x86/hpet.c @@ -61,6 +61,36 @@ u8 __initdata hpet_blockid; static bool_t __initdata force_hpet_broadcast; boolean_param("hpetbroadcast", force_hpet_broadcast); +static bool_t __read_mostly hpet_verbose; +static bool_t __read_mostly hpet_debug; +static void __init parse_hpet_param(char * s) +{ + char *ss; + int val; + + do { + val = !!strncmp(s, "no-", 3); + if ( !val ) + s += 3; + + ss = strchr(s, ','); + if ( ss ) + *ss = '\0'; + + if ( !strcmp(s, "verbose") ) + hpet_verbose = val; + else if ( !strcmp(s, "debug") ) + { + hpet_debug = val; + if ( val ) + hpet_verbose = 1; + } + + s = ss + 1; + } while ( ss ); +} +custom_param("hpet", parse_hpet_param); + /* * Calculate a multiplication factor for scaled math, which is used to convert * nanoseconds based values to clock ticks: @@ -94,6 +124,35 @@ static inline unsigned long ns2ticks(unsigned long nsec, int shift, return (unsigned long) tmp; } +static void __maybe_unused dump_hpet_timer(int timer) +{ + u32 cfg = hpet_read32(HPET_Tn_CFG(timer)); + + printk(XENLOG_INFO "HPET: Timer %02u CFG: raw 0x%08"PRIx32 + " Caps: %d %c%c", timer, cfg, + cfg & HPET_TN_64BIT_CAP ? 64 : 32, + cfg & HPET_TN_FSB_CAP ? 'M' : '-', + cfg & HPET_TN_PERIODIC_CAP ? 'P' : '-'); + + printk("\n Setup: "); + + if ( (cfg & HPET_TN_FSB_CAP) && (cfg & HPET_TN_FSB) ) + printk("FSB "); + + if ( !(cfg & HPET_TN_FSB) ) + printk("GSI %#x ", + (cfg & HPET_TN_ROUTE) >> HPET_TN_ROUTE_SHIFT); + + if ( cfg & HPET_TN_32BIT ) + printk("32bit "); + + if ( cfg & HPET_TN_PERIODIC ) + printk("Periodic "); + + printk("%sabled ", cfg & HPET_TN_ENABLE ? "En" : "Dis"); + printk("%s\n", cfg & HPET_TN_LEVEL ? "Level" : "Edge"); +} + static int hpet_next_event(unsigned long delta, int timer) { uint32_t cnt, cmp; @@ -769,7 +828,14 @@ u64 __init hpet_setup(void) unsigned int last; if ( hpet_rate ) + { + if ( hpet_debug ) + printk(XENLOG_DEBUG "HPET: Skipping re-setup\n"); return hpet_rate; + } + + if ( hpet_debug ) + printk(XENLOG_DEBUG "HPET: Setting up hpet data\n"); if ( hpet_address == 0 ) return 0; @@ -783,6 +849,20 @@ u64 __init hpet_setup(void) return 0; } + if ( hpet_verbose ) + { + printk(XENLOG_INFO "HPET: Vendor: %04"PRIx16", Rev: %u, %u timers\n", + hpet_id >> HPET_ID_VENDOR_SHIFT, + hpet_id & HPET_ID_REV, + ((hpet_id & HPET_ID_NUMBER) >> HPET_ID_NUMBER_SHIFT) + 1); + printk(XENLOG_INFO "HPET: Caps: "); + if ( hpet_id & HPET_ID_LEGSUP ) + printk("Legacy "); + if ( hpet_id & HPET_ID_64BIT ) + printk("64bit "); + printk("\n"); + } + /* Check for sane period (100ps <= period <= 100ns). */ hpet_period = hpet_read32(HPET_PERIOD); if ( (hpet_period > 100000000) || (hpet_period < 100000) ) @@ -840,6 +920,9 @@ void hpet_resume(u32 *boot_cfg) cfg &= ~HPET_TN_RESERVED; } hpet_write32(cfg, HPET_Tn_CFG(i)); + + if ( hpet_verbose ) + dump_hpet_timer(i); } cfg = hpet_read32(HPET_CFG); -- 1.7.10.4 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |