diff options
Diffstat (limited to 'arch/x86/kernel/apic/es7000_32.c')
| -rw-r--r-- | arch/x86/kernel/apic/es7000_32.c | 51 |
1 files changed, 19 insertions, 32 deletions
diff --git a/arch/x86/kernel/apic/es7000_32.c b/arch/x86/kernel/apic/es7000_32.c index db4ab1be3c79..0874799a98c6 100644 --- a/arch/x86/kernel/apic/es7000_32.c +++ b/arch/x86/kernel/apic/es7000_32.c | |||
| @@ -394,21 +394,6 @@ static void es7000_enable_apic_mode(void) | |||
| 394 | WARN(1, "Command failed, status = %x\n", mip_status); | 394 | WARN(1, "Command failed, status = %x\n", mip_status); |
| 395 | } | 395 | } |
| 396 | 396 | ||
| 397 | static void es7000_vector_allocation_domain(int cpu, struct cpumask *retmask) | ||
| 398 | { | ||
| 399 | /* Careful. Some cpus do not strictly honor the set of cpus | ||
| 400 | * specified in the interrupt destination when using lowest | ||
| 401 | * priority interrupt delivery mode. | ||
| 402 | * | ||
| 403 | * In particular there was a hyperthreading cpu observed to | ||
| 404 | * deliver interrupts to the wrong hyperthread when only one | ||
| 405 | * hyperthread was specified in the interrupt desitination. | ||
| 406 | */ | ||
| 407 | cpumask_clear(retmask); | ||
| 408 | cpumask_bits(retmask)[0] = APIC_ALL_CPUS; | ||
| 409 | } | ||
| 410 | |||
| 411 | |||
| 412 | static void es7000_wait_for_init_deassert(atomic_t *deassert) | 397 | static void es7000_wait_for_init_deassert(atomic_t *deassert) |
| 413 | { | 398 | { |
| 414 | while (!atomic_read(deassert)) | 399 | while (!atomic_read(deassert)) |
| @@ -540,45 +525,49 @@ static int es7000_check_phys_apicid_present(int cpu_physical_apicid) | |||
| 540 | return 1; | 525 | return 1; |
| 541 | } | 526 | } |
| 542 | 527 | ||
| 543 | static unsigned int es7000_cpu_mask_to_apicid(const struct cpumask *cpumask) | 528 | static inline int |
| 529 | es7000_cpu_mask_to_apicid(const struct cpumask *cpumask, unsigned int *dest_id) | ||
| 544 | { | 530 | { |
| 545 | unsigned int round = 0; | 531 | unsigned int round = 0; |
| 546 | int cpu, uninitialized_var(apicid); | 532 | unsigned int cpu, uninitialized_var(apicid); |
| 547 | 533 | ||
| 548 | /* | 534 | /* |
| 549 | * The cpus in the mask must all be on the apic cluster. | 535 | * The cpus in the mask must all be on the apic cluster. |
| 550 | */ | 536 | */ |
| 551 | for_each_cpu(cpu, cpumask) { | 537 | for_each_cpu_and(cpu, cpumask, cpu_online_mask) { |
| 552 | int new_apicid = early_per_cpu(x86_cpu_to_logical_apicid, cpu); | 538 | int new_apicid = early_per_cpu(x86_cpu_to_logical_apicid, cpu); |
| 553 | 539 | ||
| 554 | if (round && APIC_CLUSTER(apicid) != APIC_CLUSTER(new_apicid)) { | 540 | if (round && APIC_CLUSTER(apicid) != APIC_CLUSTER(new_apicid)) { |
| 555 | WARN(1, "Not a valid mask!"); | 541 | WARN(1, "Not a valid mask!"); |
| 556 | 542 | ||
| 557 | return BAD_APICID; | 543 | return -EINVAL; |
| 558 | } | 544 | } |
| 559 | apicid = new_apicid; | 545 | apicid |= new_apicid; |
| 560 | round++; | 546 | round++; |
| 561 | } | 547 | } |
| 562 | return apicid; | 548 | if (!round) |
| 549 | return -EINVAL; | ||
| 550 | *dest_id = apicid; | ||
| 551 | return 0; | ||
| 563 | } | 552 | } |
| 564 | 553 | ||
| 565 | static unsigned int | 554 | static int |
| 566 | es7000_cpu_mask_to_apicid_and(const struct cpumask *inmask, | 555 | es7000_cpu_mask_to_apicid_and(const struct cpumask *inmask, |
| 567 | const struct cpumask *andmask) | 556 | const struct cpumask *andmask, |
| 557 | unsigned int *apicid) | ||
| 568 | { | 558 | { |
| 569 | int apicid = early_per_cpu(x86_cpu_to_logical_apicid, 0); | ||
| 570 | cpumask_var_t cpumask; | 559 | cpumask_var_t cpumask; |
| 560 | *apicid = early_per_cpu(x86_cpu_to_logical_apicid, 0); | ||
| 571 | 561 | ||
| 572 | if (!alloc_cpumask_var(&cpumask, GFP_ATOMIC)) | 562 | if (!alloc_cpumask_var(&cpumask, GFP_ATOMIC)) |
| 573 | return apicid; | 563 | return 0; |
| 574 | 564 | ||
| 575 | cpumask_and(cpumask, inmask, andmask); | 565 | cpumask_and(cpumask, inmask, andmask); |
| 576 | cpumask_and(cpumask, cpumask, cpu_online_mask); | 566 | es7000_cpu_mask_to_apicid(cpumask, apicid); |
| 577 | apicid = es7000_cpu_mask_to_apicid(cpumask); | ||
| 578 | 567 | ||
| 579 | free_cpumask_var(cpumask); | 568 | free_cpumask_var(cpumask); |
| 580 | 569 | ||
| 581 | return apicid; | 570 | return 0; |
| 582 | } | 571 | } |
| 583 | 572 | ||
| 584 | static int es7000_phys_pkg_id(int cpuid_apic, int index_msb) | 573 | static int es7000_phys_pkg_id(int cpuid_apic, int index_msb) |
| @@ -638,7 +627,7 @@ static struct apic __refdata apic_es7000_cluster = { | |||
| 638 | .check_apicid_used = es7000_check_apicid_used, | 627 | .check_apicid_used = es7000_check_apicid_used, |
| 639 | .check_apicid_present = es7000_check_apicid_present, | 628 | .check_apicid_present = es7000_check_apicid_present, |
| 640 | 629 | ||
| 641 | .vector_allocation_domain = es7000_vector_allocation_domain, | 630 | .vector_allocation_domain = flat_vector_allocation_domain, |
| 642 | .init_apic_ldr = es7000_init_apic_ldr_cluster, | 631 | .init_apic_ldr = es7000_init_apic_ldr_cluster, |
| 643 | 632 | ||
| 644 | .ioapic_phys_id_map = es7000_ioapic_phys_id_map, | 633 | .ioapic_phys_id_map = es7000_ioapic_phys_id_map, |
| @@ -656,7 +645,6 @@ static struct apic __refdata apic_es7000_cluster = { | |||
| 656 | .set_apic_id = NULL, | 645 | .set_apic_id = NULL, |
| 657 | .apic_id_mask = 0xFF << 24, | 646 | .apic_id_mask = 0xFF << 24, |
| 658 | 647 | ||
| 659 | .cpu_mask_to_apicid = es7000_cpu_mask_to_apicid, | ||
| 660 | .cpu_mask_to_apicid_and = es7000_cpu_mask_to_apicid_and, | 648 | .cpu_mask_to_apicid_and = es7000_cpu_mask_to_apicid_and, |
| 661 | 649 | ||
| 662 | .send_IPI_mask = es7000_send_IPI_mask, | 650 | .send_IPI_mask = es7000_send_IPI_mask, |
| @@ -705,7 +693,7 @@ static struct apic __refdata apic_es7000 = { | |||
| 705 | .check_apicid_used = es7000_check_apicid_used, | 693 | .check_apicid_used = es7000_check_apicid_used, |
| 706 | .check_apicid_present = es7000_check_apicid_present, | 694 | .check_apicid_present = es7000_check_apicid_present, |
| 707 | 695 | ||
| 708 | .vector_allocation_domain = es7000_vector_allocation_domain, | 696 | .vector_allocation_domain = flat_vector_allocation_domain, |
| 709 | .init_apic_ldr = es7000_init_apic_ldr, | 697 | .init_apic_ldr = es7000_init_apic_ldr, |
| 710 | 698 | ||
| 711 | .ioapic_phys_id_map = es7000_ioapic_phys_id_map, | 699 | .ioapic_phys_id_map = es7000_ioapic_phys_id_map, |
| @@ -723,7 +711,6 @@ static struct apic __refdata apic_es7000 = { | |||
| 723 | .set_apic_id = NULL, | 711 | .set_apic_id = NULL, |
| 724 | .apic_id_mask = 0xFF << 24, | 712 | .apic_id_mask = 0xFF << 24, |
| 725 | 713 | ||
| 726 | .cpu_mask_to_apicid = es7000_cpu_mask_to_apicid, | ||
| 727 | .cpu_mask_to_apicid_and = es7000_cpu_mask_to_apicid_and, | 714 | .cpu_mask_to_apicid_and = es7000_cpu_mask_to_apicid_and, |
| 728 | 715 | ||
| 729 | .send_IPI_mask = es7000_send_IPI_mask, | 716 | .send_IPI_mask = es7000_send_IPI_mask, |
