diff options
author | Andreas Herrmann <andreas.herrmann3@amd.com> | 2009-02-20 18:09:47 -0500 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2009-02-22 12:01:14 -0500 |
commit | b98103a5597b87211a1c74077b06faeac554bedc (patch) | |
tree | eebaf01edba7d1124bbe3f4db0228f9e0936ae02 /arch/x86/kernel/hpet.c | |
parent | 2702e0a46c2d28da92b32c9b068ee1291fc0de35 (diff) |
x86: hpet: print HPET registers during setup (if hpet=verbose is used)
Signed-off-by: Andreas Herrmann <andreas.herrmann3@amd.com>
Cc: Mark Hounschell <markh@compro.net>
Cc: Borislav Petkov <borislav.petkov@amd.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'arch/x86/kernel/hpet.c')
-rw-r--r-- | arch/x86/kernel/hpet.c | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/arch/x86/kernel/hpet.c b/arch/x86/kernel/hpet.c index a00545fe5cdd..1d86ca3c1f97 100644 --- a/arch/x86/kernel/hpet.c +++ b/arch/x86/kernel/hpet.c | |||
@@ -80,6 +80,7 @@ static inline void hpet_clear_mapping(void) | |||
80 | */ | 80 | */ |
81 | static int boot_hpet_disable; | 81 | static int boot_hpet_disable; |
82 | int hpet_force_user; | 82 | int hpet_force_user; |
83 | static int hpet_verbose; | ||
83 | 84 | ||
84 | static int __init hpet_setup(char *str) | 85 | static int __init hpet_setup(char *str) |
85 | { | 86 | { |
@@ -88,6 +89,8 @@ static int __init hpet_setup(char *str) | |||
88 | boot_hpet_disable = 1; | 89 | boot_hpet_disable = 1; |
89 | if (!strncmp("force", str, 5)) | 90 | if (!strncmp("force", str, 5)) |
90 | hpet_force_user = 1; | 91 | hpet_force_user = 1; |
92 | if (!strncmp("verbose", str, 7)) | ||
93 | hpet_verbose = 1; | ||
91 | } | 94 | } |
92 | return 1; | 95 | return 1; |
93 | } | 96 | } |
@@ -119,6 +122,43 @@ int is_hpet_enabled(void) | |||
119 | } | 122 | } |
120 | EXPORT_SYMBOL_GPL(is_hpet_enabled); | 123 | EXPORT_SYMBOL_GPL(is_hpet_enabled); |
121 | 124 | ||
125 | static void _hpet_print_config(const char *function, int line) | ||
126 | { | ||
127 | u32 i, timers, l, h; | ||
128 | printk(KERN_INFO "hpet: %s(%d):\n", function, line); | ||
129 | l = hpet_readl(HPET_ID); | ||
130 | h = hpet_readl(HPET_PERIOD); | ||
131 | timers = ((l & HPET_ID_NUMBER) >> HPET_ID_NUMBER_SHIFT) + 1; | ||
132 | printk(KERN_INFO "hpet: ID: 0x%x, PERIOD: 0x%x\n", l, h); | ||
133 | l = hpet_readl(HPET_CFG); | ||
134 | h = hpet_readl(HPET_STATUS); | ||
135 | printk(KERN_INFO "hpet: CFG: 0x%x, STATUS: 0x%x\n", l, h); | ||
136 | l = hpet_readl(HPET_COUNTER); | ||
137 | h = hpet_readl(HPET_COUNTER+4); | ||
138 | printk(KERN_INFO "hpet: COUNTER_l: 0x%x, COUNTER_h: 0x%x\n", l, h); | ||
139 | |||
140 | for (i = 0; i < timers; i++) { | ||
141 | l = hpet_readl(HPET_Tn_CFG(i)); | ||
142 | h = hpet_readl(HPET_Tn_CFG(i)+4); | ||
143 | printk(KERN_INFO "hpet: T%d: CFG_l: 0x%x, CFG_h: 0x%x\n", | ||
144 | i, l, h); | ||
145 | l = hpet_readl(HPET_Tn_CMP(i)); | ||
146 | h = hpet_readl(HPET_Tn_CMP(i)+4); | ||
147 | printk(KERN_INFO "hpet: T%d: CMP_l: 0x%x, CMP_h: 0x%x\n", | ||
148 | i, l, h); | ||
149 | l = hpet_readl(HPET_Tn_ROUTE(i)); | ||
150 | h = hpet_readl(HPET_Tn_ROUTE(i)+4); | ||
151 | printk(KERN_INFO "hpet: T%d ROUTE_l: 0x%x, ROUTE_h: 0x%x\n", | ||
152 | i, l, h); | ||
153 | } | ||
154 | } | ||
155 | |||
156 | #define hpet_print_config() \ | ||
157 | do { \ | ||
158 | if (hpet_verbose) \ | ||
159 | _hpet_print_config(__FUNCTION__, __LINE__); \ | ||
160 | } while (0) | ||
161 | |||
122 | /* | 162 | /* |
123 | * When the hpet driver (/dev/hpet) is enabled, we need to reserve | 163 | * When the hpet driver (/dev/hpet) is enabled, we need to reserve |
124 | * timer 0 and timer 1 in case of RTC emulation. | 164 | * timer 0 and timer 1 in case of RTC emulation. |
@@ -282,6 +322,7 @@ static void hpet_set_mode(enum clock_event_mode mode, | |||
282 | hpet_writel(cmp, HPET_Tn_CMP(timer)); | 322 | hpet_writel(cmp, HPET_Tn_CMP(timer)); |
283 | udelay(1); | 323 | udelay(1); |
284 | hpet_writel((unsigned long) delta, HPET_Tn_CMP(timer)); | 324 | hpet_writel((unsigned long) delta, HPET_Tn_CMP(timer)); |
325 | hpet_print_config(); | ||
285 | break; | 326 | break; |
286 | 327 | ||
287 | case CLOCK_EVT_MODE_ONESHOT: | 328 | case CLOCK_EVT_MODE_ONESHOT: |
@@ -308,6 +349,7 @@ static void hpet_set_mode(enum clock_event_mode mode, | |||
308 | irq_set_affinity(hdev->irq, cpumask_of(hdev->cpu)); | 349 | irq_set_affinity(hdev->irq, cpumask_of(hdev->cpu)); |
309 | enable_irq(hdev->irq); | 350 | enable_irq(hdev->irq); |
310 | } | 351 | } |
352 | hpet_print_config(); | ||
311 | break; | 353 | break; |
312 | } | 354 | } |
313 | } | 355 | } |
@@ -526,6 +568,7 @@ static void hpet_msi_capability_lookup(unsigned int start_timer) | |||
526 | 568 | ||
527 | num_timers = ((id & HPET_ID_NUMBER) >> HPET_ID_NUMBER_SHIFT); | 569 | num_timers = ((id & HPET_ID_NUMBER) >> HPET_ID_NUMBER_SHIFT); |
528 | num_timers++; /* Value read out starts from 0 */ | 570 | num_timers++; /* Value read out starts from 0 */ |
571 | hpet_print_config(); | ||
529 | 572 | ||
530 | hpet_devs = kzalloc(sizeof(struct hpet_dev) * num_timers, GFP_KERNEL); | 573 | hpet_devs = kzalloc(sizeof(struct hpet_dev) * num_timers, GFP_KERNEL); |
531 | if (!hpet_devs) | 574 | if (!hpet_devs) |
@@ -793,6 +836,7 @@ int __init hpet_enable(void) | |||
793 | * information and the number of channels | 836 | * information and the number of channels |
794 | */ | 837 | */ |
795 | id = hpet_readl(HPET_ID); | 838 | id = hpet_readl(HPET_ID); |
839 | hpet_print_config(); | ||
796 | 840 | ||
797 | #ifdef CONFIG_HPET_EMULATE_RTC | 841 | #ifdef CONFIG_HPET_EMULATE_RTC |
798 | /* | 842 | /* |
@@ -845,6 +889,7 @@ static __init int hpet_late_init(void) | |||
845 | return -ENODEV; | 889 | return -ENODEV; |
846 | 890 | ||
847 | hpet_reserve_platform_timers(hpet_readl(HPET_ID)); | 891 | hpet_reserve_platform_timers(hpet_readl(HPET_ID)); |
892 | hpet_print_config(); | ||
848 | 893 | ||
849 | for_each_online_cpu(cpu) { | 894 | for_each_online_cpu(cpu) { |
850 | hpet_cpuhp_notify(NULL, CPU_ONLINE, (void *)(long)cpu); | 895 | hpet_cpuhp_notify(NULL, CPU_ONLINE, (void *)(long)cpu); |