diff options
Diffstat (limited to 'arch/x86/kernel/mpparse.c')
-rw-r--r-- | arch/x86/kernel/mpparse.c | 375 |
1 files changed, 181 insertions, 194 deletions
diff --git a/arch/x86/kernel/mpparse.c b/arch/x86/kernel/mpparse.c index e8192401da47..dce99dca6cf8 100644 --- a/arch/x86/kernel/mpparse.c +++ b/arch/x86/kernel/mpparse.c | |||
@@ -109,9 +109,6 @@ static void __init MP_bus_info(struct mpc_bus *m) | |||
109 | } else | 109 | } else |
110 | printk(KERN_WARNING "Unknown bustype %s - ignoring\n", str); | 110 | printk(KERN_WARNING "Unknown bustype %s - ignoring\n", str); |
111 | } | 111 | } |
112 | #endif | ||
113 | |||
114 | #ifdef CONFIG_X86_IO_APIC | ||
115 | 112 | ||
116 | static int bad_ioapic(unsigned long address) | 113 | static int bad_ioapic(unsigned long address) |
117 | { | 114 | { |
@@ -224,8 +221,12 @@ static void __init MP_intsrc_info(struct mpc_intsrc *m) | |||
224 | if (++mp_irq_entries == MAX_IRQ_SOURCES) | 221 | if (++mp_irq_entries == MAX_IRQ_SOURCES) |
225 | panic("Max # of irq sources exceeded!!\n"); | 222 | panic("Max # of irq sources exceeded!!\n"); |
226 | } | 223 | } |
224 | #else /* CONFIG_X86_IO_APIC */ | ||
225 | static inline void __init MP_bus_info(struct mpc_bus *m) {} | ||
226 | static inline void __init MP_ioapic_info(struct mpc_ioapic *m) {} | ||
227 | static inline void __init MP_intsrc_info(struct mpc_intsrc *m) {} | ||
228 | #endif /* CONFIG_X86_IO_APIC */ | ||
227 | 229 | ||
228 | #endif | ||
229 | 230 | ||
230 | static void __init MP_lintsrc_info(struct mpc_lintsrc *m) | 231 | static void __init MP_lintsrc_info(struct mpc_lintsrc *m) |
231 | { | 232 | { |
@@ -275,6 +276,20 @@ static int __init smp_check_mpc(struct mpc_table *mpc, char *oem, char *str) | |||
275 | return 1; | 276 | return 1; |
276 | } | 277 | } |
277 | 278 | ||
279 | static void skip_entry(unsigned char **ptr, int *count, int size) | ||
280 | { | ||
281 | *ptr += size; | ||
282 | *count += size; | ||
283 | } | ||
284 | |||
285 | static void __init smp_dump_mptable(struct mpc_table *mpc, unsigned char *mpt) | ||
286 | { | ||
287 | printk(KERN_ERR "Your mptable is wrong, contact your HW vendor!\n" | ||
288 | "type %x\n", *mpt); | ||
289 | print_hex_dump(KERN_ERR, " ", DUMP_PREFIX_ADDRESS, 16, | ||
290 | 1, mpc, mpc->length, 1); | ||
291 | } | ||
292 | |||
278 | static int __init smp_read_mpc(struct mpc_table *mpc, unsigned early) | 293 | static int __init smp_read_mpc(struct mpc_table *mpc, unsigned early) |
279 | { | 294 | { |
280 | char str[16]; | 295 | char str[16]; |
@@ -310,61 +325,30 @@ static int __init smp_read_mpc(struct mpc_table *mpc, unsigned early) | |||
310 | while (count < mpc->length) { | 325 | while (count < mpc->length) { |
311 | switch (*mpt) { | 326 | switch (*mpt) { |
312 | case MP_PROCESSOR: | 327 | case MP_PROCESSOR: |
313 | { | 328 | /* ACPI may have already provided this data */ |
314 | struct mpc_cpu *m = (struct mpc_cpu *)mpt; | 329 | if (!acpi_lapic) |
315 | /* ACPI may have already provided this data */ | 330 | MP_processor_info((struct mpc_cpu *)mpt); |
316 | if (!acpi_lapic) | 331 | skip_entry(&mpt, &count, sizeof(struct mpc_cpu)); |
317 | MP_processor_info(m); | 332 | break; |
318 | mpt += sizeof(*m); | ||
319 | count += sizeof(*m); | ||
320 | break; | ||
321 | } | ||
322 | case MP_BUS: | 333 | case MP_BUS: |
323 | { | 334 | MP_bus_info((struct mpc_bus *)mpt); |
324 | struct mpc_bus *m = (struct mpc_bus *)mpt; | 335 | skip_entry(&mpt, &count, sizeof(struct mpc_bus)); |
325 | #ifdef CONFIG_X86_IO_APIC | 336 | break; |
326 | MP_bus_info(m); | ||
327 | #endif | ||
328 | mpt += sizeof(*m); | ||
329 | count += sizeof(*m); | ||
330 | break; | ||
331 | } | ||
332 | case MP_IOAPIC: | 337 | case MP_IOAPIC: |
333 | { | 338 | MP_ioapic_info((struct mpc_ioapic *)mpt); |
334 | #ifdef CONFIG_X86_IO_APIC | 339 | skip_entry(&mpt, &count, sizeof(struct mpc_ioapic)); |
335 | struct mpc_ioapic *m = (struct mpc_ioapic *)mpt; | 340 | break; |
336 | MP_ioapic_info(m); | ||
337 | #endif | ||
338 | mpt += sizeof(struct mpc_ioapic); | ||
339 | count += sizeof(struct mpc_ioapic); | ||
340 | break; | ||
341 | } | ||
342 | case MP_INTSRC: | 341 | case MP_INTSRC: |
343 | { | 342 | MP_intsrc_info((struct mpc_intsrc *)mpt); |
344 | #ifdef CONFIG_X86_IO_APIC | 343 | skip_entry(&mpt, &count, sizeof(struct mpc_intsrc)); |
345 | struct mpc_intsrc *m = (struct mpc_intsrc *)mpt; | 344 | break; |
346 | |||
347 | MP_intsrc_info(m); | ||
348 | #endif | ||
349 | mpt += sizeof(struct mpc_intsrc); | ||
350 | count += sizeof(struct mpc_intsrc); | ||
351 | break; | ||
352 | } | ||
353 | case MP_LINTSRC: | 345 | case MP_LINTSRC: |
354 | { | 346 | MP_lintsrc_info((struct mpc_lintsrc *)mpt); |
355 | struct mpc_lintsrc *m = | 347 | skip_entry(&mpt, &count, sizeof(struct mpc_lintsrc)); |
356 | (struct mpc_lintsrc *)mpt; | 348 | break; |
357 | MP_lintsrc_info(m); | ||
358 | mpt += sizeof(*m); | ||
359 | count += sizeof(*m); | ||
360 | break; | ||
361 | } | ||
362 | default: | 349 | default: |
363 | /* wrong mptable */ | 350 | /* wrong mptable */ |
364 | printk(KERN_ERR "Your mptable is wrong, contact your HW vendor!\n"); | 351 | smp_dump_mptable(mpc, mpt); |
365 | printk(KERN_ERR "type %x\n", *mpt); | ||
366 | print_hex_dump(KERN_ERR, " ", DUMP_PREFIX_ADDRESS, 16, | ||
367 | 1, mpc, mpc->length, 1); | ||
368 | count = mpc->length; | 352 | count = mpc->length; |
369 | break; | 353 | break; |
370 | } | 354 | } |
@@ -571,6 +555,55 @@ static unsigned long __init get_mpc_size(unsigned long physptr) | |||
571 | return size; | 555 | return size; |
572 | } | 556 | } |
573 | 557 | ||
558 | static int __init check_physptr(struct mpf_intel *mpf, unsigned int early) | ||
559 | { | ||
560 | struct mpc_table *mpc; | ||
561 | unsigned long size; | ||
562 | |||
563 | size = get_mpc_size(mpf->physptr); | ||
564 | mpc = early_ioremap(mpf->physptr, size); | ||
565 | /* | ||
566 | * Read the physical hardware table. Anything here will | ||
567 | * override the defaults. | ||
568 | */ | ||
569 | if (!smp_read_mpc(mpc, early)) { | ||
570 | #ifdef CONFIG_X86_LOCAL_APIC | ||
571 | smp_found_config = 0; | ||
572 | #endif | ||
573 | printk(KERN_ERR "BIOS bug, MP table errors detected!...\n" | ||
574 | "... disabling SMP support. (tell your hw vendor)\n"); | ||
575 | early_iounmap(mpc, size); | ||
576 | return -1; | ||
577 | } | ||
578 | early_iounmap(mpc, size); | ||
579 | |||
580 | if (early) | ||
581 | return -1; | ||
582 | |||
583 | #ifdef CONFIG_X86_IO_APIC | ||
584 | /* | ||
585 | * If there are no explicit MP IRQ entries, then we are | ||
586 | * broken. We set up most of the low 16 IO-APIC pins to | ||
587 | * ISA defaults and hope it will work. | ||
588 | */ | ||
589 | if (!mp_irq_entries) { | ||
590 | struct mpc_bus bus; | ||
591 | |||
592 | printk(KERN_ERR "BIOS bug, no explicit IRQ entries, " | ||
593 | "using default mptable. (tell your hw vendor)\n"); | ||
594 | |||
595 | bus.type = MP_BUS; | ||
596 | bus.busid = 0; | ||
597 | memcpy(bus.bustype, "ISA ", 6); | ||
598 | MP_bus_info(&bus); | ||
599 | |||
600 | construct_default_ioirq_mptable(0); | ||
601 | } | ||
602 | #endif | ||
603 | |||
604 | return 0; | ||
605 | } | ||
606 | |||
574 | /* | 607 | /* |
575 | * Scan the memory blocks for an SMP configuration block. | 608 | * Scan the memory blocks for an SMP configuration block. |
576 | */ | 609 | */ |
@@ -624,51 +657,8 @@ static void __init __get_smp_config(unsigned int early) | |||
624 | construct_default_ISA_mptable(mpf->feature1); | 657 | construct_default_ISA_mptable(mpf->feature1); |
625 | 658 | ||
626 | } else if (mpf->physptr) { | 659 | } else if (mpf->physptr) { |
627 | struct mpc_table *mpc; | 660 | if (check_physptr(mpf, early)) |
628 | unsigned long size; | ||
629 | |||
630 | size = get_mpc_size(mpf->physptr); | ||
631 | mpc = early_ioremap(mpf->physptr, size); | ||
632 | /* | ||
633 | * Read the physical hardware table. Anything here will | ||
634 | * override the defaults. | ||
635 | */ | ||
636 | if (!smp_read_mpc(mpc, early)) { | ||
637 | #ifdef CONFIG_X86_LOCAL_APIC | ||
638 | smp_found_config = 0; | ||
639 | #endif | ||
640 | printk(KERN_ERR | ||
641 | "BIOS bug, MP table errors detected!...\n"); | ||
642 | printk(KERN_ERR "... disabling SMP support. " | ||
643 | "(tell your hw vendor)\n"); | ||
644 | early_iounmap(mpc, size); | ||
645 | return; | ||
646 | } | ||
647 | early_iounmap(mpc, size); | ||
648 | |||
649 | if (early) | ||
650 | return; | 661 | return; |
651 | #ifdef CONFIG_X86_IO_APIC | ||
652 | /* | ||
653 | * If there are no explicit MP IRQ entries, then we are | ||
654 | * broken. We set up most of the low 16 IO-APIC pins to | ||
655 | * ISA defaults and hope it will work. | ||
656 | */ | ||
657 | if (!mp_irq_entries) { | ||
658 | struct mpc_bus bus; | ||
659 | |||
660 | printk(KERN_ERR "BIOS bug, no explicit IRQ entries, " | ||
661 | "using default mptable. " | ||
662 | "(tell your hw vendor)\n"); | ||
663 | |||
664 | bus.type = MP_BUS; | ||
665 | bus.busid = 0; | ||
666 | memcpy(bus.bustype, "ISA ", 6); | ||
667 | MP_bus_info(&bus); | ||
668 | |||
669 | construct_default_ioirq_mptable(0); | ||
670 | } | ||
671 | #endif | ||
672 | } else | 662 | } else |
673 | BUG(); | 663 | BUG(); |
674 | 664 | ||
@@ -689,6 +679,31 @@ void __init get_smp_config(void) | |||
689 | __get_smp_config(0); | 679 | __get_smp_config(0); |
690 | } | 680 | } |
691 | 681 | ||
682 | static void smp_reserve_bootmem(struct mpf_intel *mpf) | ||
683 | { | ||
684 | unsigned long size = get_mpc_size(mpf->physptr); | ||
685 | #ifdef CONFIG_X86_32 | ||
686 | /* | ||
687 | * We cannot access to MPC table to compute table size yet, | ||
688 | * as only few megabytes from the bottom is mapped now. | ||
689 | * PC-9800's MPC table places on the very last of physical | ||
690 | * memory; so that simply reserving PAGE_SIZE from mpf->physptr | ||
691 | * yields BUG() in reserve_bootmem. | ||
692 | * also need to make sure physptr is below than max_low_pfn | ||
693 | * we don't need reserve the area above max_low_pfn | ||
694 | */ | ||
695 | unsigned long end = max_low_pfn * PAGE_SIZE; | ||
696 | |||
697 | if (mpf->physptr < end) { | ||
698 | if (mpf->physptr + size > end) | ||
699 | size = end - mpf->physptr; | ||
700 | reserve_bootmem_generic(mpf->physptr, size, BOOTMEM_DEFAULT); | ||
701 | } | ||
702 | #else | ||
703 | reserve_bootmem_generic(mpf->physptr, size, BOOTMEM_DEFAULT); | ||
704 | #endif | ||
705 | } | ||
706 | |||
692 | static int __init smp_scan_config(unsigned long base, unsigned long length, | 707 | static int __init smp_scan_config(unsigned long base, unsigned long length, |
693 | unsigned reserve) | 708 | unsigned reserve) |
694 | { | 709 | { |
@@ -717,35 +732,9 @@ static int __init smp_scan_config(unsigned long base, unsigned long length, | |||
717 | if (!reserve) | 732 | if (!reserve) |
718 | return 1; | 733 | return 1; |
719 | reserve_bootmem_generic(virt_to_phys(mpf), sizeof(*mpf), | 734 | reserve_bootmem_generic(virt_to_phys(mpf), sizeof(*mpf), |
720 | BOOTMEM_DEFAULT); | ||
721 | if (mpf->physptr) { | ||
722 | unsigned long size = get_mpc_size(mpf->physptr); | ||
723 | #ifdef CONFIG_X86_32 | ||
724 | /* | ||
725 | * We cannot access to MPC table to compute | ||
726 | * table size yet, as only few megabytes from | ||
727 | * the bottom is mapped now. | ||
728 | * PC-9800's MPC table places on the very last | ||
729 | * of physical memory; so that simply reserving | ||
730 | * PAGE_SIZE from mpf->physptr yields BUG() | ||
731 | * in reserve_bootmem. | ||
732 | * also need to make sure physptr is below than | ||
733 | * max_low_pfn | ||
734 | * we don't need reserve the area above max_low_pfn | ||
735 | */ | ||
736 | unsigned long end = max_low_pfn * PAGE_SIZE; | ||
737 | |||
738 | if (mpf->physptr < end) { | ||
739 | if (mpf->physptr + size > end) | ||
740 | size = end - mpf->physptr; | ||
741 | reserve_bootmem_generic(mpf->physptr, size, | ||
742 | BOOTMEM_DEFAULT); | ||
743 | } | ||
744 | #else | ||
745 | reserve_bootmem_generic(mpf->physptr, size, | ||
746 | BOOTMEM_DEFAULT); | 735 | BOOTMEM_DEFAULT); |
747 | #endif | 736 | if (mpf->physptr) |
748 | } | 737 | smp_reserve_bootmem(mpf); |
749 | 738 | ||
750 | return 1; | 739 | return 1; |
751 | } | 740 | } |
@@ -848,7 +837,57 @@ static int __init get_MP_intsrc_index(struct mpc_intsrc *m) | |||
848 | #define SPARE_SLOT_NUM 20 | 837 | #define SPARE_SLOT_NUM 20 |
849 | 838 | ||
850 | static struct mpc_intsrc __initdata *m_spare[SPARE_SLOT_NUM]; | 839 | static struct mpc_intsrc __initdata *m_spare[SPARE_SLOT_NUM]; |
851 | #endif | 840 | |
841 | static void check_irq_src(struct mpc_intsrc *m, int *nr_m_spare) | ||
842 | { | ||
843 | int i; | ||
844 | |||
845 | apic_printk(APIC_VERBOSE, "OLD "); | ||
846 | print_MP_intsrc_info(m); | ||
847 | |||
848 | i = get_MP_intsrc_index(m); | ||
849 | if (i > 0) { | ||
850 | assign_to_mpc_intsrc(&mp_irqs[i], m); | ||
851 | apic_printk(APIC_VERBOSE, "NEW "); | ||
852 | print_mp_irq_info(&mp_irqs[i]); | ||
853 | return; | ||
854 | } | ||
855 | if (!i) { | ||
856 | /* legacy, do nothing */ | ||
857 | return; | ||
858 | } | ||
859 | if (*nr_m_spare < SPARE_SLOT_NUM) { | ||
860 | /* | ||
861 | * not found (-1), or duplicated (-2) are invalid entries, | ||
862 | * we need to use the slot later | ||
863 | */ | ||
864 | m_spare[*nr_m_spare] = m; | ||
865 | *nr_m_spare += 1; | ||
866 | } | ||
867 | } | ||
868 | #else /* CONFIG_X86_IO_APIC */ | ||
869 | static inline void check_irq_src(struct mpc_intsrc *m, int *nr_m_spare) {} | ||
870 | #endif /* CONFIG_X86_IO_APIC */ | ||
871 | |||
872 | static int check_slot(unsigned long mpc_new_phys, unsigned long mpc_new_length, | ||
873 | int count) | ||
874 | { | ||
875 | if (!mpc_new_phys) { | ||
876 | pr_info("No spare slots, try to append...take your risk, " | ||
877 | "new mpc_length %x\n", count); | ||
878 | } else { | ||
879 | if (count <= mpc_new_length) | ||
880 | pr_info("No spare slots, try to append..., " | ||
881 | "new mpc_length %x\n", count); | ||
882 | else { | ||
883 | pr_err("mpc_new_length %lx is too small\n", | ||
884 | mpc_new_length); | ||
885 | return -1; | ||
886 | } | ||
887 | } | ||
888 | |||
889 | return 0; | ||
890 | } | ||
852 | 891 | ||
853 | static int __init replace_intsrc_all(struct mpc_table *mpc, | 892 | static int __init replace_intsrc_all(struct mpc_table *mpc, |
854 | unsigned long mpc_new_phys, | 893 | unsigned long mpc_new_phys, |
@@ -856,77 +895,33 @@ static int __init replace_intsrc_all(struct mpc_table *mpc, | |||
856 | { | 895 | { |
857 | #ifdef CONFIG_X86_IO_APIC | 896 | #ifdef CONFIG_X86_IO_APIC |
858 | int i; | 897 | int i; |
859 | int nr_m_spare = 0; | ||
860 | #endif | 898 | #endif |
861 | |||
862 | int count = sizeof(*mpc); | 899 | int count = sizeof(*mpc); |
900 | int nr_m_spare = 0; | ||
863 | unsigned char *mpt = ((unsigned char *)mpc) + count; | 901 | unsigned char *mpt = ((unsigned char *)mpc) + count; |
864 | 902 | ||
865 | printk(KERN_INFO "mpc_length %x\n", mpc->length); | 903 | printk(KERN_INFO "mpc_length %x\n", mpc->length); |
866 | while (count < mpc->length) { | 904 | while (count < mpc->length) { |
867 | switch (*mpt) { | 905 | switch (*mpt) { |
868 | case MP_PROCESSOR: | 906 | case MP_PROCESSOR: |
869 | { | 907 | skip_entry(&mpt, &count, sizeof(struct mpc_cpu)); |
870 | struct mpc_cpu *m = (struct mpc_cpu *)mpt; | 908 | break; |
871 | mpt += sizeof(*m); | ||
872 | count += sizeof(*m); | ||
873 | break; | ||
874 | } | ||
875 | case MP_BUS: | 909 | case MP_BUS: |
876 | { | 910 | skip_entry(&mpt, &count, sizeof(struct mpc_bus)); |
877 | struct mpc_bus *m = (struct mpc_bus *)mpt; | 911 | break; |
878 | mpt += sizeof(*m); | ||
879 | count += sizeof(*m); | ||
880 | break; | ||
881 | } | ||
882 | case MP_IOAPIC: | 912 | case MP_IOAPIC: |
883 | { | 913 | skip_entry(&mpt, &count, sizeof(struct mpc_ioapic)); |
884 | mpt += sizeof(struct mpc_ioapic); | 914 | break; |
885 | count += sizeof(struct mpc_ioapic); | ||
886 | break; | ||
887 | } | ||
888 | case MP_INTSRC: | 915 | case MP_INTSRC: |
889 | { | 916 | check_irq_src((struct mpc_intsrc *)mpt, &nr_m_spare); |
890 | #ifdef CONFIG_X86_IO_APIC | 917 | skip_entry(&mpt, &count, sizeof(struct mpc_intsrc)); |
891 | struct mpc_intsrc *m = (struct mpc_intsrc *)mpt; | 918 | break; |
892 | |||
893 | printk(KERN_INFO "OLD "); | ||
894 | print_MP_intsrc_info(m); | ||
895 | i = get_MP_intsrc_index(m); | ||
896 | if (i > 0) { | ||
897 | assign_to_mpc_intsrc(&mp_irqs[i], m); | ||
898 | printk(KERN_INFO "NEW "); | ||
899 | print_mp_irq_info(&mp_irqs[i]); | ||
900 | } else if (!i) { | ||
901 | /* legacy, do nothing */ | ||
902 | } else if (nr_m_spare < SPARE_SLOT_NUM) { | ||
903 | /* | ||
904 | * not found (-1), or duplicated (-2) | ||
905 | * are invalid entries, | ||
906 | * we need to use the slot later | ||
907 | */ | ||
908 | m_spare[nr_m_spare] = m; | ||
909 | nr_m_spare++; | ||
910 | } | ||
911 | #endif | ||
912 | mpt += sizeof(struct mpc_intsrc); | ||
913 | count += sizeof(struct mpc_intsrc); | ||
914 | break; | ||
915 | } | ||
916 | case MP_LINTSRC: | 919 | case MP_LINTSRC: |
917 | { | 920 | skip_entry(&mpt, &count, sizeof(struct mpc_lintsrc)); |
918 | struct mpc_lintsrc *m = | 921 | break; |
919 | (struct mpc_lintsrc *)mpt; | ||
920 | mpt += sizeof(*m); | ||
921 | count += sizeof(*m); | ||
922 | break; | ||
923 | } | ||
924 | default: | 922 | default: |
925 | /* wrong mptable */ | 923 | /* wrong mptable */ |
926 | printk(KERN_ERR "Your mptable is wrong, contact your HW vendor!\n"); | 924 | smp_dump_mptable(mpc, mpt); |
927 | printk(KERN_ERR "type %x\n", *mpt); | ||
928 | print_hex_dump(KERN_ERR, " ", DUMP_PREFIX_ADDRESS, 16, | ||
929 | 1, mpc, mpc->length, 1); | ||
930 | goto out; | 925 | goto out; |
931 | } | 926 | } |
932 | } | 927 | } |
@@ -943,23 +938,15 @@ static int __init replace_intsrc_all(struct mpc_table *mpc, | |||
943 | continue; | 938 | continue; |
944 | 939 | ||
945 | if (nr_m_spare > 0) { | 940 | if (nr_m_spare > 0) { |
946 | printk(KERN_INFO "*NEW* found "); | 941 | apic_printk(APIC_VERBOSE, "*NEW* found\n"); |
947 | nr_m_spare--; | 942 | nr_m_spare--; |
948 | assign_to_mpc_intsrc(&mp_irqs[i], m_spare[nr_m_spare]); | 943 | assign_to_mpc_intsrc(&mp_irqs[i], m_spare[nr_m_spare]); |
949 | m_spare[nr_m_spare] = NULL; | 944 | m_spare[nr_m_spare] = NULL; |
950 | } else { | 945 | } else { |
951 | struct mpc_intsrc *m = (struct mpc_intsrc *)mpt; | 946 | struct mpc_intsrc *m = (struct mpc_intsrc *)mpt; |
952 | count += sizeof(struct mpc_intsrc); | 947 | count += sizeof(struct mpc_intsrc); |
953 | if (!mpc_new_phys) { | 948 | if (!check_slot(mpc_new_phys, mpc_new_length, count)) |
954 | printk(KERN_INFO "No spare slots, try to append...take your risk, new mpc_length %x\n", count); | 949 | goto out; |
955 | } else { | ||
956 | if (count <= mpc_new_length) | ||
957 | printk(KERN_INFO "No spare slots, try to append..., new mpc_length %x\n", count); | ||
958 | else { | ||
959 | printk(KERN_ERR "mpc_new_length %lx is too small\n", mpc_new_length); | ||
960 | goto out; | ||
961 | } | ||
962 | } | ||
963 | assign_to_mpc_intsrc(&mp_irqs[i], m); | 950 | assign_to_mpc_intsrc(&mp_irqs[i], m); |
964 | mpc->length = count; | 951 | mpc->length = count; |
965 | mpt += sizeof(struct mpc_intsrc); | 952 | mpt += sizeof(struct mpc_intsrc); |