diff options
| -rw-r--r-- | Documentation/kernel-parameters.txt | 4 | ||||
| -rw-r--r-- | arch/x86/kernel/hpet.c | 45 |
2 files changed, 48 insertions, 1 deletions
diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt index b182626739ea..01379a822646 100644 --- a/Documentation/kernel-parameters.txt +++ b/Documentation/kernel-parameters.txt | |||
| @@ -492,10 +492,12 @@ and is between 256 and 4096 characters. It is defined in the file | |||
| 492 | Default: 64 | 492 | Default: 64 |
| 493 | 493 | ||
| 494 | hpet= [X86-32,HPET] option to control HPET usage | 494 | hpet= [X86-32,HPET] option to control HPET usage |
| 495 | Format: { enable (default) | disable | force } | 495 | Format: { enable (default) | disable | force | |
| 496 | verbose } | ||
| 496 | disable: disable HPET and use PIT instead | 497 | disable: disable HPET and use PIT instead |
| 497 | force: allow force enabled of undocumented chips (ICH4, | 498 | force: allow force enabled of undocumented chips (ICH4, |
| 498 | VIA, nVidia) | 499 | VIA, nVidia) |
| 500 | verbose: show contents of HPET registers during setup | ||
| 499 | 501 | ||
| 500 | com20020= [HW,NET] ARCnet - COM20020 chipset | 502 | com20020= [HW,NET] ARCnet - COM20020 chipset |
| 501 | Format: | 503 | Format: |
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); |
