diff options
| author | Steve French <sfrench@us.ibm.com> | 2011-12-16 01:39:20 -0500 |
|---|---|---|
| committer | Steve French <sfrench@us.ibm.com> | 2011-12-16 01:39:20 -0500 |
| commit | aaf015890754d58dcb71a4aa44ed246bb082bcf6 (patch) | |
| tree | 17b51ff707fd1b3efec3a3ab872f0d7a7416aca5 /arch/x86/kernel/apic | |
| parent | 9c32c63bb70b2fafc3b18bee29959c3bf245ceba (diff) | |
| parent | 8def5f51b012efb00e77ba2d04696cc0aadd0609 (diff) | |
Merge branch 'master' of git+ssh://git.samba.org/data/git/sfrench/cifs-2.6
Diffstat (limited to 'arch/x86/kernel/apic')
| -rw-r--r-- | arch/x86/kernel/apic/apic.c | 33 | ||||
| -rw-r--r-- | arch/x86/kernel/apic/io_apic.c | 9 | ||||
| -rw-r--r-- | arch/x86/kernel/apic/x2apic_uv_x.c | 2 |
3 files changed, 34 insertions, 10 deletions
diff --git a/arch/x86/kernel/apic/apic.c b/arch/x86/kernel/apic/apic.c index a2fd72e0ab35..f98d84caf94c 100644 --- a/arch/x86/kernel/apic/apic.c +++ b/arch/x86/kernel/apic/apic.c | |||
| @@ -186,7 +186,7 @@ static struct resource lapic_resource = { | |||
| 186 | .flags = IORESOURCE_MEM | IORESOURCE_BUSY, | 186 | .flags = IORESOURCE_MEM | IORESOURCE_BUSY, |
| 187 | }; | 187 | }; |
| 188 | 188 | ||
| 189 | static unsigned int calibration_result; | 189 | unsigned int lapic_timer_frequency = 0; |
| 190 | 190 | ||
| 191 | static void apic_pm_activate(void); | 191 | static void apic_pm_activate(void); |
| 192 | 192 | ||
| @@ -454,7 +454,7 @@ static void lapic_timer_setup(enum clock_event_mode mode, | |||
| 454 | switch (mode) { | 454 | switch (mode) { |
| 455 | case CLOCK_EVT_MODE_PERIODIC: | 455 | case CLOCK_EVT_MODE_PERIODIC: |
| 456 | case CLOCK_EVT_MODE_ONESHOT: | 456 | case CLOCK_EVT_MODE_ONESHOT: |
| 457 | __setup_APIC_LVTT(calibration_result, | 457 | __setup_APIC_LVTT(lapic_timer_frequency, |
| 458 | mode != CLOCK_EVT_MODE_PERIODIC, 1); | 458 | mode != CLOCK_EVT_MODE_PERIODIC, 1); |
| 459 | break; | 459 | break; |
| 460 | case CLOCK_EVT_MODE_UNUSED: | 460 | case CLOCK_EVT_MODE_UNUSED: |
| @@ -638,6 +638,25 @@ static int __init calibrate_APIC_clock(void) | |||
| 638 | long delta, deltatsc; | 638 | long delta, deltatsc; |
| 639 | int pm_referenced = 0; | 639 | int pm_referenced = 0; |
| 640 | 640 | ||
| 641 | /** | ||
| 642 | * check if lapic timer has already been calibrated by platform | ||
| 643 | * specific routine, such as tsc calibration code. if so, we just fill | ||
| 644 | * in the clockevent structure and return. | ||
| 645 | */ | ||
| 646 | |||
| 647 | if (lapic_timer_frequency) { | ||
| 648 | apic_printk(APIC_VERBOSE, "lapic timer already calibrated %d\n", | ||
| 649 | lapic_timer_frequency); | ||
| 650 | lapic_clockevent.mult = div_sc(lapic_timer_frequency/APIC_DIVISOR, | ||
| 651 | TICK_NSEC, lapic_clockevent.shift); | ||
| 652 | lapic_clockevent.max_delta_ns = | ||
| 653 | clockevent_delta2ns(0x7FFFFF, &lapic_clockevent); | ||
| 654 | lapic_clockevent.min_delta_ns = | ||
| 655 | clockevent_delta2ns(0xF, &lapic_clockevent); | ||
| 656 | lapic_clockevent.features &= ~CLOCK_EVT_FEAT_DUMMY; | ||
| 657 | return 0; | ||
| 658 | } | ||
| 659 | |||
| 641 | local_irq_disable(); | 660 | local_irq_disable(); |
| 642 | 661 | ||
| 643 | /* Replace the global interrupt handler */ | 662 | /* Replace the global interrupt handler */ |
| @@ -679,12 +698,12 @@ static int __init calibrate_APIC_clock(void) | |||
| 679 | lapic_clockevent.min_delta_ns = | 698 | lapic_clockevent.min_delta_ns = |
| 680 | clockevent_delta2ns(0xF, &lapic_clockevent); | 699 | clockevent_delta2ns(0xF, &lapic_clockevent); |
| 681 | 700 | ||
| 682 | calibration_result = (delta * APIC_DIVISOR) / LAPIC_CAL_LOOPS; | 701 | lapic_timer_frequency = (delta * APIC_DIVISOR) / LAPIC_CAL_LOOPS; |
| 683 | 702 | ||
| 684 | apic_printk(APIC_VERBOSE, "..... delta %ld\n", delta); | 703 | apic_printk(APIC_VERBOSE, "..... delta %ld\n", delta); |
| 685 | apic_printk(APIC_VERBOSE, "..... mult: %u\n", lapic_clockevent.mult); | 704 | apic_printk(APIC_VERBOSE, "..... mult: %u\n", lapic_clockevent.mult); |
| 686 | apic_printk(APIC_VERBOSE, "..... calibration result: %u\n", | 705 | apic_printk(APIC_VERBOSE, "..... calibration result: %u\n", |
| 687 | calibration_result); | 706 | lapic_timer_frequency); |
| 688 | 707 | ||
| 689 | if (cpu_has_tsc) { | 708 | if (cpu_has_tsc) { |
| 690 | apic_printk(APIC_VERBOSE, "..... CPU clock speed is " | 709 | apic_printk(APIC_VERBOSE, "..... CPU clock speed is " |
| @@ -695,13 +714,13 @@ static int __init calibrate_APIC_clock(void) | |||
| 695 | 714 | ||
| 696 | apic_printk(APIC_VERBOSE, "..... host bus clock speed is " | 715 | apic_printk(APIC_VERBOSE, "..... host bus clock speed is " |
| 697 | "%u.%04u MHz.\n", | 716 | "%u.%04u MHz.\n", |
| 698 | calibration_result / (1000000 / HZ), | 717 | lapic_timer_frequency / (1000000 / HZ), |
| 699 | calibration_result % (1000000 / HZ)); | 718 | lapic_timer_frequency % (1000000 / HZ)); |
| 700 | 719 | ||
| 701 | /* | 720 | /* |
| 702 | * Do a sanity check on the APIC calibration result | 721 | * Do a sanity check on the APIC calibration result |
| 703 | */ | 722 | */ |
| 704 | if (calibration_result < (1000000 / HZ)) { | 723 | if (lapic_timer_frequency < (1000000 / HZ)) { |
| 705 | local_irq_enable(); | 724 | local_irq_enable(); |
| 706 | pr_warning("APIC frequency too slow, disabling apic timer\n"); | 725 | pr_warning("APIC frequency too slow, disabling apic timer\n"); |
| 707 | return -1; | 726 | return -1; |
diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c index 3c31fa98af6d..6d939d7847e2 100644 --- a/arch/x86/kernel/apic/io_apic.c +++ b/arch/x86/kernel/apic/io_apic.c | |||
| @@ -193,10 +193,8 @@ int __init arch_early_irq_init(void) | |||
| 193 | struct irq_cfg *cfg; | 193 | struct irq_cfg *cfg; |
| 194 | int count, node, i; | 194 | int count, node, i; |
| 195 | 195 | ||
| 196 | if (!legacy_pic->nr_legacy_irqs) { | 196 | if (!legacy_pic->nr_legacy_irqs) |
| 197 | nr_irqs_gsi = 0; | ||
| 198 | io_apic_irqs = ~0UL; | 197 | io_apic_irqs = ~0UL; |
| 199 | } | ||
| 200 | 198 | ||
| 201 | for (i = 0; i < nr_ioapics; i++) { | 199 | for (i = 0; i < nr_ioapics; i++) { |
| 202 | ioapics[i].saved_registers = | 200 | ioapics[i].saved_registers = |
| @@ -1696,6 +1694,7 @@ __apicdebuginit(void) print_IO_APICs(void) | |||
| 1696 | int ioapic_idx; | 1694 | int ioapic_idx; |
| 1697 | struct irq_cfg *cfg; | 1695 | struct irq_cfg *cfg; |
| 1698 | unsigned int irq; | 1696 | unsigned int irq; |
| 1697 | struct irq_chip *chip; | ||
| 1699 | 1698 | ||
| 1700 | printk(KERN_DEBUG "number of MP IRQ sources: %d.\n", mp_irq_entries); | 1699 | printk(KERN_DEBUG "number of MP IRQ sources: %d.\n", mp_irq_entries); |
| 1701 | for (ioapic_idx = 0; ioapic_idx < nr_ioapics; ioapic_idx++) | 1700 | for (ioapic_idx = 0; ioapic_idx < nr_ioapics; ioapic_idx++) |
| @@ -1716,6 +1715,10 @@ __apicdebuginit(void) print_IO_APICs(void) | |||
| 1716 | for_each_active_irq(irq) { | 1715 | for_each_active_irq(irq) { |
| 1717 | struct irq_pin_list *entry; | 1716 | struct irq_pin_list *entry; |
| 1718 | 1717 | ||
| 1718 | chip = irq_get_chip(irq); | ||
| 1719 | if (chip != &ioapic_chip) | ||
| 1720 | continue; | ||
| 1721 | |||
| 1719 | cfg = irq_get_chip_data(irq); | 1722 | cfg = irq_get_chip_data(irq); |
| 1720 | if (!cfg) | 1723 | if (!cfg) |
| 1721 | continue; | 1724 | continue; |
diff --git a/arch/x86/kernel/apic/x2apic_uv_x.c b/arch/x86/kernel/apic/x2apic_uv_x.c index 62ae3001ae02..9d59bbacd4e3 100644 --- a/arch/x86/kernel/apic/x2apic_uv_x.c +++ b/arch/x86/kernel/apic/x2apic_uv_x.c | |||
| @@ -93,6 +93,8 @@ static int __init early_get_pnodeid(void) | |||
| 93 | 93 | ||
| 94 | if (node_id.s.part_number == UV2_HUB_PART_NUMBER) | 94 | if (node_id.s.part_number == UV2_HUB_PART_NUMBER) |
| 95 | uv_min_hub_revision_id += UV2_HUB_REVISION_BASE - 1; | 95 | uv_min_hub_revision_id += UV2_HUB_REVISION_BASE - 1; |
| 96 | if (node_id.s.part_number == UV2_HUB_PART_NUMBER_X) | ||
| 97 | uv_min_hub_revision_id += UV2_HUB_REVISION_BASE - 1; | ||
| 96 | 98 | ||
| 97 | uv_hub_info->hub_revision = uv_min_hub_revision_id; | 99 | uv_hub_info->hub_revision = uv_min_hub_revision_id; |
| 98 | pnode = (node_id.s.node_id >> 1) & ((1 << m_n_config.s.n_skt) - 1); | 100 | pnode = (node_id.s.node_id >> 1) & ((1 << m_n_config.s.n_skt) - 1); |
