linux/arch/x86/kernel/mpparse.c
<<
>>
Prefs
   1/*
   2 *      Intel Multiprocessor Specification 1.1 and 1.4
   3 *      compliant MP-table parsing routines.
   4 *
   5 *      (c) 1995 Alan Cox, Building #3 <alan@redhat.com>
   6 *      (c) 1998, 1999, 2000 Ingo Molnar <mingo@redhat.com>
   7 *      (c) 2008 Alexey Starikovskiy <astarikovskiy@suse.de>
   8 */
   9
  10#include <linux/mm.h>
  11#include <linux/init.h>
  12#include <linux/delay.h>
  13#include <linux/bootmem.h>
  14#include <linux/kernel_stat.h>
  15#include <linux/mc146818rtc.h>
  16#include <linux/bitops.h>
  17#include <linux/acpi.h>
  18#include <linux/module.h>
  19
  20#include <asm/smp.h>
  21#include <asm/mtrr.h>
  22#include <asm/mpspec.h>
  23#include <asm/pgalloc.h>
  24#include <asm/io_apic.h>
  25#include <asm/proto.h>
  26#include <asm/acpi.h>
  27#include <asm/bios_ebda.h>
  28#include <asm/e820.h>
  29#include <asm/trampoline.h>
  30#include <asm/setup.h>
  31
  32#include <mach_apic.h>
  33#ifdef CONFIG_X86_32
  34#include <mach_apicdef.h>
  35#include <mach_mpparse.h>
  36#endif
  37
  38/*
  39 * Checksum an MP configuration block.
  40 */
  41
  42static int __init mpf_checksum(unsigned char *mp, int len)
  43{
  44        int sum = 0;
  45
  46        while (len--)
  47                sum += *mp++;
  48
  49        return sum & 0xFF;
  50}
  51
  52static void __init MP_processor_info(struct mpc_config_processor *m)
  53{
  54        int apicid;
  55        char *bootup_cpu = "";
  56
  57        if (!(m->mpc_cpuflag & CPU_ENABLED)) {
  58                disabled_cpus++;
  59                return;
  60        }
  61
  62        if (x86_quirks->mpc_apic_id)
  63                apicid = x86_quirks->mpc_apic_id(m);
  64        else
  65                apicid = m->mpc_apicid;
  66
  67        if (m->mpc_cpuflag & CPU_BOOTPROCESSOR) {
  68                bootup_cpu = " (Bootup-CPU)";
  69                boot_cpu_physical_apicid = m->mpc_apicid;
  70        }
  71
  72        printk(KERN_INFO "Processor #%d%s\n", m->mpc_apicid, bootup_cpu);
  73        generic_processor_info(apicid, m->mpc_apicver);
  74}
  75
  76#ifdef CONFIG_X86_IO_APIC
  77static void __init MP_bus_info(struct mpc_config_bus *m)
  78{
  79        char str[7];
  80        memcpy(str, m->mpc_bustype, 6);
  81        str[6] = 0;
  82
  83        if (x86_quirks->mpc_oem_bus_info)
  84                x86_quirks->mpc_oem_bus_info(m, str);
  85        else
  86                apic_printk(APIC_VERBOSE, "Bus #%d is %s\n", m->mpc_busid, str);
  87
  88#if MAX_MP_BUSSES < 256
  89        if (m->mpc_busid >= MAX_MP_BUSSES) {
  90                printk(KERN_WARNING "MP table busid value (%d) for bustype %s "
  91                       " is too large, max. supported is %d\n",
  92                       m->mpc_busid, str, MAX_MP_BUSSES - 1);
  93                return;
  94        }
  95#endif
  96
  97        if (strncmp(str, BUSTYPE_ISA, sizeof(BUSTYPE_ISA) - 1) == 0) {
  98                 set_bit(m->mpc_busid, mp_bus_not_pci);
  99#if defined(CONFIG_EISA) || defined (CONFIG_MCA)
 100                mp_bus_id_to_type[m->mpc_busid] = MP_BUS_ISA;
 101#endif
 102        } else if (strncmp(str, BUSTYPE_PCI, sizeof(BUSTYPE_PCI) - 1) == 0) {
 103                if (x86_quirks->mpc_oem_pci_bus)
 104                        x86_quirks->mpc_oem_pci_bus(m);
 105
 106                clear_bit(m->mpc_busid, mp_bus_not_pci);
 107#if defined(CONFIG_EISA) || defined (CONFIG_MCA)
 108                mp_bus_id_to_type[m->mpc_busid] = MP_BUS_PCI;
 109        } else if (strncmp(str, BUSTYPE_EISA, sizeof(BUSTYPE_EISA) - 1) == 0) {
 110                mp_bus_id_to_type[m->mpc_busid] = MP_BUS_EISA;
 111        } else if (strncmp(str, BUSTYPE_MCA, sizeof(BUSTYPE_MCA) - 1) == 0) {
 112                mp_bus_id_to_type[m->mpc_busid] = MP_BUS_MCA;
 113#endif
 114        } else
 115                printk(KERN_WARNING "Unknown bustype %s - ignoring\n", str);
 116}
 117#endif
 118
 119#ifdef CONFIG_X86_IO_APIC
 120
 121static int bad_ioapic(unsigned long address)
 122{
 123        if (nr_ioapics >= MAX_IO_APICS) {
 124                printk(KERN_ERR "ERROR: Max # of I/O APICs (%d) exceeded "
 125                       "(found %d)\n", MAX_IO_APICS, nr_ioapics);
 126                panic("Recompile kernel with bigger MAX_IO_APICS!\n");
 127        }
 128        if (!address) {
 129                printk(KERN_ERR "WARNING: Bogus (zero) I/O APIC address"
 130                       " found in table, skipping!\n");
 131                return 1;
 132        }
 133        return 0;
 134}
 135
 136static void __init MP_ioapic_info(struct mpc_config_ioapic *m)
 137{
 138        if (!(m->mpc_flags & MPC_APIC_USABLE))
 139                return;
 140
 141        printk(KERN_INFO "I/O APIC #%d Version %d at 0x%X.\n",
 142               m->mpc_apicid, m->mpc_apicver, m->mpc_apicaddr);
 143
 144        if (bad_ioapic(m->mpc_apicaddr))
 145                return;
 146
 147        mp_ioapics[nr_ioapics].mp_apicaddr = m->mpc_apicaddr;
 148        mp_ioapics[nr_ioapics].mp_apicid = m->mpc_apicid;
 149        mp_ioapics[nr_ioapics].mp_type = m->mpc_type;
 150        mp_ioapics[nr_ioapics].mp_apicver = m->mpc_apicver;
 151        mp_ioapics[nr_ioapics].mp_flags = m->mpc_flags;
 152        nr_ioapics++;
 153}
 154
 155static void print_MP_intsrc_info(struct mpc_config_intsrc *m)
 156{
 157        apic_printk(APIC_VERBOSE, "Int: type %d, pol %d, trig %d, bus %02x,"
 158                " IRQ %02x, APIC ID %x, APIC INT %02x\n",
 159                m->mpc_irqtype, m->mpc_irqflag & 3,
 160                (m->mpc_irqflag >> 2) & 3, m->mpc_srcbus,
 161                m->mpc_srcbusirq, m->mpc_dstapic, m->mpc_dstirq);
 162}
 163
 164static void __init print_mp_irq_info(struct mp_config_intsrc *mp_irq)
 165{
 166        apic_printk(APIC_VERBOSE, "Int: type %d, pol %d, trig %d, bus %02x,"
 167                " IRQ %02x, APIC ID %x, APIC INT %02x\n",
 168                mp_irq->mp_irqtype, mp_irq->mp_irqflag & 3,
 169                (mp_irq->mp_irqflag >> 2) & 3, mp_irq->mp_srcbus,
 170                mp_irq->mp_srcbusirq, mp_irq->mp_dstapic, mp_irq->mp_dstirq);
 171}
 172
 173static void __init assign_to_mp_irq(struct mpc_config_intsrc *m,
 174                                    struct mp_config_intsrc *mp_irq)
 175{
 176        mp_irq->mp_dstapic = m->mpc_dstapic;
 177        mp_irq->mp_type = m->mpc_type;
 178        mp_irq->mp_irqtype = m->mpc_irqtype;
 179        mp_irq->mp_irqflag = m->mpc_irqflag;
 180        mp_irq->mp_srcbus = m->mpc_srcbus;
 181        mp_irq->mp_srcbusirq = m->mpc_srcbusirq;
 182        mp_irq->mp_dstirq = m->mpc_dstirq;
 183}
 184
 185static void __init assign_to_mpc_intsrc(struct mp_config_intsrc *mp_irq,
 186                                        struct mpc_config_intsrc *m)
 187{
 188        m->mpc_dstapic = mp_irq->mp_dstapic;
 189        m->mpc_type = mp_irq->mp_type;
 190        m->mpc_irqtype = mp_irq->mp_irqtype;
 191        m->mpc_irqflag = mp_irq->mp_irqflag;
 192        m->mpc_srcbus = mp_irq->mp_srcbus;
 193        m->mpc_srcbusirq = mp_irq->mp_srcbusirq;
 194        m->mpc_dstirq = mp_irq->mp_dstirq;
 195}
 196
 197static int __init mp_irq_mpc_intsrc_cmp(struct mp_config_intsrc *mp_irq,
 198                                        struct mpc_config_intsrc *m)
 199{
 200        if (mp_irq->mp_dstapic != m->mpc_dstapic)
 201                return 1;
 202        if (mp_irq->mp_type != m->mpc_type)
 203                return 2;
 204        if (mp_irq->mp_irqtype != m->mpc_irqtype)
 205                return 3;
 206        if (mp_irq->mp_irqflag != m->mpc_irqflag)
 207                return 4;
 208        if (mp_irq->mp_srcbus != m->mpc_srcbus)
 209                return 5;
 210        if (mp_irq->mp_srcbusirq != m->mpc_srcbusirq)
 211                return 6;
 212        if (mp_irq->mp_dstirq != m->mpc_dstirq)
 213                return 7;
 214
 215        return 0;
 216}
 217
 218static void __init MP_intsrc_info(struct mpc_config_intsrc *m)
 219{
 220        int i;
 221
 222        print_MP_intsrc_info(m);
 223
 224        for (i = 0; i < mp_irq_entries; i++) {
 225                if (!mp_irq_mpc_intsrc_cmp(&mp_irqs[i], m))
 226                        return;
 227        }
 228
 229        assign_to_mp_irq(m, &mp_irqs[mp_irq_entries]);
 230        if (++mp_irq_entries == MAX_IRQ_SOURCES)
 231                panic("Max # of irq sources exceeded!!\n");
 232}
 233
 234#endif
 235
 236static void __init MP_lintsrc_info(struct mpc_config_lintsrc *m)
 237{
 238        apic_printk(APIC_VERBOSE, "Lint: type %d, pol %d, trig %d, bus %02x,"
 239                " IRQ %02x, APIC ID %x, APIC LINT %02x\n",
 240                m->mpc_irqtype, m->mpc_irqflag & 3,
 241                (m->mpc_irqflag >> 2) & 3, m->mpc_srcbusid,
 242                m->mpc_srcbusirq, m->mpc_destapic, m->mpc_destapiclint);
 243}
 244
 245/*
 246 * Read/parse the MPC
 247 */
 248
 249static int __init smp_check_mpc(struct mp_config_table *mpc, char *oem,
 250                                char *str)
 251{
 252
 253        if (memcmp(mpc->mpc_signature, MPC_SIGNATURE, 4)) {
 254                printk(KERN_ERR "MPTABLE: bad signature [%c%c%c%c]!\n",
 255                       mpc->mpc_signature[0], mpc->mpc_signature[1],
 256                       mpc->mpc_signature[2], mpc->mpc_signature[3]);
 257                return 0;
 258        }
 259        if (mpf_checksum((unsigned char *)mpc, mpc->mpc_length)) {
 260                printk(KERN_ERR "MPTABLE: checksum error!\n");
 261                return 0;
 262        }
 263        if (mpc->mpc_spec != 0x01 && mpc->mpc_spec != 0x04) {
 264                printk(KERN_ERR "MPTABLE: bad table version (%d)!!\n",
 265                       mpc->mpc_spec);
 266                return 0;
 267        }
 268        if (!mpc->mpc_lapic) {
 269                printk(KERN_ERR "MPTABLE: null local APIC address!\n");
 270                return 0;
 271        }
 272        memcpy(oem, mpc->mpc_oem, 8);
 273        oem[8] = 0;
 274        printk(KERN_INFO "MPTABLE: OEM ID: %s\n", oem);
 275
 276        memcpy(str, mpc->mpc_productid, 12);
 277        str[12] = 0;
 278
 279        printk(KERN_INFO "MPTABLE: Product ID: %s\n", str);
 280
 281        printk(KERN_INFO "MPTABLE: APIC at: 0x%X\n", mpc->mpc_lapic);
 282
 283        return 1;
 284}
 285
 286static int __init smp_read_mpc(struct mp_config_table *mpc, unsigned early)
 287{
 288        char str[16];
 289        char oem[10];
 290
 291        int count = sizeof(*mpc);
 292        unsigned char *mpt = ((unsigned char *)mpc) + count;
 293
 294        if (!smp_check_mpc(mpc, oem, str))
 295                return 0;
 296
 297#ifdef CONFIG_X86_32
 298        /*
 299         * need to make sure summit and es7000's mps_oem_check is safe to be
 300         * called early via genericarch 's mps_oem_check
 301         */
 302        if (early) {
 303#ifdef CONFIG_X86_NUMAQ
 304                numaq_mps_oem_check(mpc, oem, str);
 305#endif
 306        } else
 307                mps_oem_check(mpc, oem, str);
 308#endif
 309        /* save the local APIC address, it might be non-default */
 310        if (!acpi_lapic)
 311                mp_lapic_addr = mpc->mpc_lapic;
 312
 313        if (early)
 314                return 1;
 315
 316        if (mpc->mpc_oemptr && x86_quirks->smp_read_mpc_oem) {
 317                struct mp_config_oemtable *oem_table = (struct mp_config_oemtable *)(unsigned long)mpc->mpc_oemptr;
 318                x86_quirks->smp_read_mpc_oem(oem_table, mpc->mpc_oemsize);
 319        }
 320
 321        /*
 322         *      Now process the configuration blocks.
 323         */
 324        if (x86_quirks->mpc_record)
 325                *x86_quirks->mpc_record = 0;
 326
 327        while (count < mpc->mpc_length) {
 328                switch (*mpt) {
 329                case MP_PROCESSOR:
 330                        {
 331                                struct mpc_config_processor *m =
 332                                    (struct mpc_config_processor *)mpt;
 333                                /* ACPI may have already provided this data */
 334                                if (!acpi_lapic)
 335                                        MP_processor_info(m);
 336                                mpt += sizeof(*m);
 337                                count += sizeof(*m);
 338                                break;
 339                        }
 340                case MP_BUS:
 341                        {
 342                                struct mpc_config_bus *m =
 343                                    (struct mpc_config_bus *)mpt;
 344#ifdef CONFIG_X86_IO_APIC
 345                                MP_bus_info(m);
 346#endif
 347                                mpt += sizeof(*m);
 348                                count += sizeof(*m);
 349                                break;
 350                        }
 351                case MP_IOAPIC:
 352                        {
 353#ifdef CONFIG_X86_IO_APIC
 354                                struct mpc_config_ioapic *m =
 355                                    (struct mpc_config_ioapic *)mpt;
 356                                MP_ioapic_info(m);
 357#endif
 358                                mpt += sizeof(struct mpc_config_ioapic);
 359                                count += sizeof(struct mpc_config_ioapic);
 360                                break;
 361                        }
 362                case MP_INTSRC:
 363                        {
 364#ifdef CONFIG_X86_IO_APIC
 365                                struct mpc_config_intsrc *m =
 366                                    (struct mpc_config_intsrc *)mpt;
 367
 368                                MP_intsrc_info(m);
 369#endif
 370                                mpt += sizeof(struct mpc_config_intsrc);
 371                                count += sizeof(struct mpc_config_intsrc);
 372                                break;
 373                        }
 374                case MP_LINTSRC:
 375                        {
 376                                struct mpc_config_lintsrc *m =
 377                                    (struct mpc_config_lintsrc *)mpt;
 378                                MP_lintsrc_info(m);
 379                                mpt += sizeof(*m);
 380                                count += sizeof(*m);
 381                                break;
 382                        }
 383                default:
 384                        /* wrong mptable */
 385                        printk(KERN_ERR "Your mptable is wrong, contact your HW vendor!\n");
 386                        printk(KERN_ERR "type %x\n", *mpt);
 387                        print_hex_dump(KERN_ERR, "  ", DUMP_PREFIX_ADDRESS, 16,
 388                                        1, mpc, mpc->mpc_length, 1);
 389                        count = mpc->mpc_length;
 390                        break;
 391                }
 392                if (x86_quirks->mpc_record)
 393                        (*x86_quirks->mpc_record)++;
 394        }
 395
 396#ifdef CONFIG_X86_GENERICARCH
 397       generic_bigsmp_probe();
 398#endif
 399
 400#ifdef CONFIG_X86_32
 401        setup_apic_routing();
 402#endif
 403        if (!num_processors)
 404                printk(KERN_ERR "MPTABLE: no processors registered!\n");
 405        return num_processors;
 406}
 407
 408#ifdef CONFIG_X86_IO_APIC
 409
 410static int __init ELCR_trigger(unsigned int irq)
 411{
 412        unsigned int port;
 413
 414        port = 0x4d0 + (irq >> 3);
 415        return (inb(port) >> (irq & 7)) & 1;
 416}
 417
 418static void __init construct_default_ioirq_mptable(int mpc_default_type)
 419{
 420        struct mpc_config_intsrc intsrc;
 421        int i;
 422        int ELCR_fallback = 0;
 423
 424        intsrc.mpc_type = MP_INTSRC;
 425        intsrc.mpc_irqflag = 0; /* conforming */
 426        intsrc.mpc_srcbus = 0;
 427        intsrc.mpc_dstapic = mp_ioapics[0].mp_apicid;
 428
 429        intsrc.mpc_irqtype = mp_INT;
 430
 431        /*
 432         *  If true, we have an ISA/PCI system with no IRQ entries
 433         *  in the MP table. To prevent the PCI interrupts from being set up
 434         *  incorrectly, we try to use the ELCR. The sanity check to see if
 435         *  there is good ELCR data is very simple - IRQ0, 1, 2 and 13 can
 436         *  never be level sensitive, so we simply see if the ELCR agrees.
 437         *  If it does, we assume it's valid.
 438         */
 439        if (mpc_default_type == 5) {
 440                printk(KERN_INFO "ISA/PCI bus type with no IRQ information... "
 441                       "falling back to ELCR\n");
 442
 443                if (ELCR_trigger(0) || ELCR_trigger(1) || ELCR_trigger(2) ||
 444                    ELCR_trigger(13))
 445                        printk(KERN_ERR "ELCR contains invalid data... "
 446                               "not using ELCR\n");
 447                else {
 448                        printk(KERN_INFO
 449                               "Using ELCR to identify PCI interrupts\n");
 450                        ELCR_fallback = 1;
 451                }
 452        }
 453
 454        for (i = 0; i < 16; i++) {
 455                switch (mpc_default_type) {
 456                case 2:
 457                        if (i == 0 || i == 13)
 458                                continue;       /* IRQ0 & IRQ13 not connected */
 459                        /* fall through */
 460                default:
 461                        if (i == 2)
 462                                continue;       /* IRQ2 is never connected */
 463                }
 464
 465                if (ELCR_fallback) {
 466                        /*
 467                         *  If the ELCR indicates a level-sensitive interrupt, we
 468                         *  copy that information over to the MP table in the
 469                         *  irqflag field (level sensitive, active high polarity).
 470                         */
 471                        if (ELCR_trigger(i))
 472                                intsrc.mpc_irqflag = 13;
 473                        else
 474                                intsrc.mpc_irqflag = 0;
 475                }
 476
 477                intsrc.mpc_srcbusirq = i;
 478                intsrc.mpc_dstirq = i ? i : 2;  /* IRQ0 to INTIN2 */
 479                MP_intsrc_info(&intsrc);
 480        }
 481
 482        intsrc.mpc_irqtype = mp_ExtINT;
 483        intsrc.mpc_srcbusirq = 0;
 484        intsrc.mpc_dstirq = 0;  /* 8259A to INTIN0 */
 485        MP_intsrc_info(&intsrc);
 486}
 487
 488
 489static void __init construct_ioapic_table(int mpc_default_type)
 490{
 491        struct mpc_config_ioapic ioapic;
 492        struct mpc_config_bus bus;
 493
 494        bus.mpc_type = MP_BUS;
 495        bus.mpc_busid = 0;
 496        switch (mpc_default_type) {
 497        default:
 498                printk(KERN_ERR "???\nUnknown standard configuration %d\n",
 499                       mpc_default_type);
 500                /* fall through */
 501        case 1:
 502        case 5:
 503                memcpy(bus.mpc_bustype, "ISA   ", 6);
 504                break;
 505        case 2:
 506        case 6:
 507        case 3:
 508                memcpy(bus.mpc_bustype, "EISA  ", 6);
 509                break;
 510        case 4:
 511        case 7:
 512                memcpy(bus.mpc_bustype, "MCA   ", 6);
 513        }
 514        MP_bus_info(&bus);
 515        if (mpc_default_type > 4) {
 516                bus.mpc_busid = 1;
 517                memcpy(bus.mpc_bustype, "PCI   ", 6);
 518                MP_bus_info(&bus);
 519        }
 520
 521        ioapic.mpc_type = MP_IOAPIC;
 522        ioapic.mpc_apicid = 2;
 523        ioapic.mpc_apicver = mpc_default_type > 4 ? 0x10 : 0x01;
 524        ioapic.mpc_flags = MPC_APIC_USABLE;
 525        ioapic.mpc_apicaddr = 0xFEC00000;
 526        MP_ioapic_info(&ioapic);
 527
 528        /*
 529         * We set up most of the low 16 IO-APIC pins according to MPS rules.
 530         */
 531        construct_default_ioirq_mptable(mpc_default_type);
 532}
 533#else
 534static inline void __init construct_ioapic_table(int mpc_default_type) { }
 535#endif
 536
 537static inline void __init construct_default_ISA_mptable(int mpc_default_type)
 538{
 539        struct mpc_config_processor processor;
 540        struct mpc_config_lintsrc lintsrc;
 541        int linttypes[2] = { mp_ExtINT, mp_NMI };
 542        int i;
 543
 544        /*
 545         * local APIC has default address
 546         */
 547        mp_lapic_addr = APIC_DEFAULT_PHYS_BASE;
 548
 549        /*
 550         * 2 CPUs, numbered 0 & 1.
 551         */
 552        processor.mpc_type = MP_PROCESSOR;
 553        /* Either an integrated APIC or a discrete 82489DX. */
 554        processor.mpc_apicver = mpc_default_type > 4 ? 0x10 : 0x01;
 555        processor.mpc_cpuflag = CPU_ENABLED;
 556        processor.mpc_cpufeature = (boot_cpu_data.x86 << 8) |
 557            (boot_cpu_data.x86_model << 4) | boot_cpu_data.x86_mask;
 558        processor.mpc_featureflag = boot_cpu_data.x86_capability[0];
 559        processor.mpc_reserved[0] = 0;
 560        processor.mpc_reserved[1] = 0;
 561        for (i = 0; i < 2; i++) {
 562                processor.mpc_apicid = i;
 563                MP_processor_info(&processor);
 564        }
 565
 566        construct_ioapic_table(mpc_default_type);
 567
 568        lintsrc.mpc_type = MP_LINTSRC;
 569        lintsrc.mpc_irqflag = 0;        /* conforming */
 570        lintsrc.mpc_srcbusid = 0;
 571        lintsrc.mpc_srcbusirq = 0;
 572        lintsrc.mpc_destapic = MP_APIC_ALL;
 573        for (i = 0; i < 2; i++) {
 574                lintsrc.mpc_irqtype = linttypes[i];
 575                lintsrc.mpc_destapiclint = i;
 576                MP_lintsrc_info(&lintsrc);
 577        }
 578}
 579
 580static struct intel_mp_floating *mpf_found;
 581
 582/*
 583 * Scan the memory blocks for an SMP configuration block.
 584 */
 585static void __init __get_smp_config(unsigned int early)
 586{
 587        struct intel_mp_floating *mpf = mpf_found;
 588
 589        if (x86_quirks->mach_get_smp_config) {
 590                if (x86_quirks->mach_get_smp_config(early))
 591                        return;
 592        }
 593        if (acpi_lapic && early)
 594                return;
 595        /*
 596         * ACPI supports both logical (e.g. Hyper-Threading) and physical
 597         * processors, where MPS only supports physical.
 598         */
 599        if (acpi_lapic && acpi_ioapic) {
 600                printk(KERN_INFO "Using ACPI (MADT) for SMP configuration "
 601                       "information\n");
 602                return;
 603        } else if (acpi_lapic)
 604                printk(KERN_INFO "Using ACPI for processor (LAPIC) "
 605                       "configuration information\n");
 606
 607        if (!mpf)
 608                return;
 609
 610        printk(KERN_INFO "Intel MultiProcessor Specification v1.%d\n",
 611               mpf->mpf_specification);
 612#if defined(CONFIG_X86_LOCAL_APIC) && defined(CONFIG_X86_32)
 613        if (mpf->mpf_feature2 & (1 << 7)) {
 614                printk(KERN_INFO "    IMCR and PIC compatibility mode.\n");
 615                pic_mode = 1;
 616        } else {
 617                printk(KERN_INFO "    Virtual Wire compatibility mode.\n");
 618                pic_mode = 0;
 619        }
 620#endif
 621        /*
 622         * Now see if we need to read further.
 623         */
 624        if (mpf->mpf_feature1 != 0) {
 625                if (early) {
 626                        /*
 627                         * local APIC has default address
 628                         */
 629                        mp_lapic_addr = APIC_DEFAULT_PHYS_BASE;
 630                        return;
 631                }
 632
 633                printk(KERN_INFO "Default MP configuration #%d\n",
 634                       mpf->mpf_feature1);
 635                construct_default_ISA_mptable(mpf->mpf_feature1);
 636
 637        } else if (mpf->mpf_physptr) {
 638
 639                /*
 640                 * Read the physical hardware table.  Anything here will
 641                 * override the defaults.
 642                 */
 643                if (!smp_read_mpc(phys_to_virt(mpf->mpf_physptr), early)) {
 644#ifdef CONFIG_X86_LOCAL_APIC
 645                        smp_found_config = 0;
 646#endif
 647                        printk(KERN_ERR
 648                               "BIOS bug, MP table errors detected!...\n");
 649                        printk(KERN_ERR "... disabling SMP support. "
 650                               "(tell your hw vendor)\n");
 651                        return;
 652                }
 653
 654                if (early)
 655                        return;
 656#ifdef CONFIG_X86_IO_APIC
 657                /*
 658                 * If there are no explicit MP IRQ entries, then we are
 659                 * broken.  We set up most of the low 16 IO-APIC pins to
 660                 * ISA defaults and hope it will work.
 661                 */
 662                if (!mp_irq_entries) {
 663                        struct mpc_config_bus bus;
 664
 665                        printk(KERN_ERR "BIOS bug, no explicit IRQ entries, "
 666                               "using default mptable. "
 667                               "(tell your hw vendor)\n");
 668
 669                        bus.mpc_type = MP_BUS;
 670                        bus.mpc_busid = 0;
 671                        memcpy(bus.mpc_bustype, "ISA   ", 6);
 672                        MP_bus_info(&bus);
 673
 674                        construct_default_ioirq_mptable(0);
 675                }
 676#endif
 677        } else
 678                BUG();
 679
 680        if (!early)
 681                printk(KERN_INFO "Processors: %d\n", num_processors);
 682        /*
 683         * Only use the first configuration found.
 684         */
 685}
 686
 687void __init early_get_smp_config(void)
 688{
 689        __get_smp_config(1);
 690}
 691
 692void __init get_smp_config(void)
 693{
 694        __get_smp_config(0);
 695}
 696
 697static int __init smp_scan_config(unsigned long base, unsigned long length,
 698                                  unsigned reserve)
 699{
 700        unsigned int *bp = phys_to_virt(base);
 701        struct intel_mp_floating *mpf;
 702
 703        apic_printk(APIC_VERBOSE, "Scan SMP from %p for %ld bytes.\n",
 704                        bp, length);
 705        BUILD_BUG_ON(sizeof(*mpf) != 16);
 706
 707        while (length > 0) {
 708                mpf = (struct intel_mp_floating *)bp;
 709                if ((*bp == SMP_MAGIC_IDENT) &&
 710                    (mpf->mpf_length == 1) &&
 711                    !mpf_checksum((unsigned char *)bp, 16) &&
 712                    ((mpf->mpf_specification == 1)
 713                     || (mpf->mpf_specification == 4))) {
 714#ifdef CONFIG_X86_LOCAL_APIC
 715                        smp_found_config = 1;
 716#endif
 717                        mpf_found = mpf;
 718
 719                        printk(KERN_INFO "found SMP MP-table at [%p] %08lx\n",
 720                               mpf, virt_to_phys(mpf));
 721
 722                        if (!reserve)
 723                                return 1;
 724                        reserve_bootmem_generic(virt_to_phys(mpf), PAGE_SIZE,
 725                                        BOOTMEM_DEFAULT);
 726                        if (mpf->mpf_physptr) {
 727                                unsigned long size = PAGE_SIZE;
 728#ifdef CONFIG_X86_32
 729                                /*
 730                                 * We cannot access to MPC table to compute
 731                                 * table size yet, as only few megabytes from
 732                                 * the bottom is mapped now.
 733                                 * PC-9800's MPC table places on the very last
 734                                 * of physical memory; so that simply reserving
 735                                 * PAGE_SIZE from mpg->mpf_physptr yields BUG()
 736                                 * in reserve_bootmem.
 737                                 */
 738                                unsigned long end = max_low_pfn * PAGE_SIZE;
 739                                if (mpf->mpf_physptr + size > end)
 740                                        size = end - mpf->mpf_physptr;
 741#endif
 742                                reserve_bootmem_generic(mpf->mpf_physptr, size,
 743                                                BOOTMEM_DEFAULT);
 744                        }
 745
 746                        return 1;
 747                }
 748                bp += 4;
 749                length -= 16;
 750        }
 751        return 0;
 752}
 753
 754static void __init __find_smp_config(unsigned int reserve)
 755{
 756        unsigned int address;
 757
 758        if (x86_quirks->mach_find_smp_config) {
 759                if (x86_quirks->mach_find_smp_config(reserve))
 760                        return;
 761        }
 762        /*
 763         * FIXME: Linux assumes you have 640K of base ram..
 764         * this continues the error...
 765         *
 766         * 1) Scan the bottom 1K for a signature
 767         * 2) Scan the top 1K of base RAM
 768         * 3) Scan the 64K of bios
 769         */
 770        if (smp_scan_config(0x0, 0x400, reserve) ||
 771            smp_scan_config(639 * 0x400, 0x400, reserve) ||
 772            smp_scan_config(0xF0000, 0x10000, reserve))
 773                return;
 774        /*
 775         * If it is an SMP machine we should know now, unless the
 776         * configuration is in an EISA/MCA bus machine with an
 777         * extended bios data area.
 778         *
 779         * there is a real-mode segmented pointer pointing to the
 780         * 4K EBDA area at 0x40E, calculate and scan it here.
 781         *
 782         * NOTE! There are Linux loaders that will corrupt the EBDA
 783         * area, and as such this kind of SMP config may be less
 784         * trustworthy, simply because the SMP table may have been
 785         * stomped on during early boot. These loaders are buggy and
 786         * should be fixed.
 787         *
 788         * MP1.4 SPEC states to only scan first 1K of 4K EBDA.
 789         */
 790
 791        address = get_bios_ebda();
 792        if (address)
 793                smp_scan_config(address, 0x400, reserve);
 794}
 795
 796void __init early_find_smp_config(void)
 797{
 798        __find_smp_config(0);
 799}
 800
 801void __init find_smp_config(void)
 802{
 803        __find_smp_config(1);
 804}
 805
 806#ifdef CONFIG_X86_IO_APIC
 807static u8 __initdata irq_used[MAX_IRQ_SOURCES];
 808
 809static int  __init get_MP_intsrc_index(struct mpc_config_intsrc *m)
 810{
 811        int i;
 812
 813        if (m->mpc_irqtype != mp_INT)
 814                return 0;
 815
 816        if (m->mpc_irqflag != 0x0f)
 817                return 0;
 818
 819        /* not legacy */
 820
 821        for (i = 0; i < mp_irq_entries; i++) {
 822                if (mp_irqs[i].mp_irqtype != mp_INT)
 823                        continue;
 824
 825                if (mp_irqs[i].mp_irqflag != 0x0f)
 826                        continue;
 827
 828                if (mp_irqs[i].mp_srcbus != m->mpc_srcbus)
 829                        continue;
 830                if (mp_irqs[i].mp_srcbusirq != m->mpc_srcbusirq)
 831                        continue;
 832                if (irq_used[i]) {
 833                        /* already claimed */
 834                        return -2;
 835                }
 836                irq_used[i] = 1;
 837                return i;
 838        }
 839
 840        /* not found */
 841        return -1;
 842}
 843
 844#define SPARE_SLOT_NUM 20
 845
 846static struct mpc_config_intsrc __initdata *m_spare[SPARE_SLOT_NUM];
 847#endif
 848
 849static int  __init replace_intsrc_all(struct mp_config_table *mpc,
 850                                        unsigned long mpc_new_phys,
 851                                        unsigned long mpc_new_length)
 852{
 853#ifdef CONFIG_X86_IO_APIC
 854        int i;
 855        int nr_m_spare = 0;
 856#endif
 857
 858        int count = sizeof(*mpc);
 859        unsigned char *mpt = ((unsigned char *)mpc) + count;
 860
 861        printk(KERN_INFO "mpc_length %x\n", mpc->mpc_length);
 862        while (count < mpc->mpc_length) {
 863                switch (*mpt) {
 864                case MP_PROCESSOR:
 865                        {
 866                                struct mpc_config_processor *m =
 867                                    (struct mpc_config_processor *)mpt;
 868                                mpt += sizeof(*m);
 869                                count += sizeof(*m);
 870                                break;
 871                        }
 872                case MP_BUS:
 873                        {
 874                                struct mpc_config_bus *m =
 875                                    (struct mpc_config_bus *)mpt;
 876                                mpt += sizeof(*m);
 877                                count += sizeof(*m);
 878                                break;
 879                        }
 880                case MP_IOAPIC:
 881                        {
 882                                mpt += sizeof(struct mpc_config_ioapic);
 883                                count += sizeof(struct mpc_config_ioapic);
 884                                break;
 885                        }
 886                case MP_INTSRC:
 887                        {
 888#ifdef CONFIG_X86_IO_APIC
 889                                struct mpc_config_intsrc *m =
 890                                    (struct mpc_config_intsrc *)mpt;
 891
 892                                printk(KERN_INFO "OLD ");
 893                                print_MP_intsrc_info(m);
 894                                i = get_MP_intsrc_index(m);
 895                                if (i > 0) {
 896                                        assign_to_mpc_intsrc(&mp_irqs[i], m);
 897                                        printk(KERN_INFO "NEW ");
 898                                        print_mp_irq_info(&mp_irqs[i]);
 899                                } else if (!i) {
 900                                        /* legacy, do nothing */
 901                                } else if (nr_m_spare < SPARE_SLOT_NUM) {
 902                                        /*
 903                                         * not found (-1), or duplicated (-2)
 904                                         * are invalid entries,
 905                                         * we need to use the slot  later
 906                                         */
 907                                        m_spare[nr_m_spare] = m;
 908                                        nr_m_spare++;
 909                                }
 910#endif
 911                                mpt += sizeof(struct mpc_config_intsrc);
 912                                count += sizeof(struct mpc_config_intsrc);
 913                                break;
 914                        }
 915                case MP_LINTSRC:
 916                        {
 917                                struct mpc_config_lintsrc *m =
 918                                    (struct mpc_config_lintsrc *)mpt;
 919                                mpt += sizeof(*m);
 920                                count += sizeof(*m);
 921                                break;
 922                        }
 923                default:
 924                        /* wrong mptable */
 925                        printk(KERN_ERR "Your mptable is wrong, contact your HW vendor!\n");
 926                        printk(KERN_ERR "type %x\n", *mpt);
 927                        print_hex_dump(KERN_ERR, "  ", DUMP_PREFIX_ADDRESS, 16,
 928                                        1, mpc, mpc->mpc_length, 1);
 929                        goto out;
 930                }
 931        }
 932
 933#ifdef CONFIG_X86_IO_APIC
 934        for (i = 0; i < mp_irq_entries; i++) {
 935                if (irq_used[i])
 936                        continue;
 937
 938                if (mp_irqs[i].mp_irqtype != mp_INT)
 939                        continue;
 940
 941                if (mp_irqs[i].mp_irqflag != 0x0f)
 942                        continue;
 943
 944                if (nr_m_spare > 0) {
 945                        printk(KERN_INFO "*NEW* found ");
 946                        nr_m_spare--;
 947                        assign_to_mpc_intsrc(&mp_irqs[i], m_spare[nr_m_spare]);
 948                        m_spare[nr_m_spare] = NULL;
 949                } else {
 950                        struct mpc_config_intsrc *m =
 951                            (struct mpc_config_intsrc *)mpt;
 952                        count += sizeof(struct mpc_config_intsrc);
 953                        if (!mpc_new_phys) {
 954                                printk(KERN_INFO "No spare slots, try to append...take your risk, new mpc_length %x\n", count);
 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);
 964                        mpc->mpc_length = count;
 965                        mpt += sizeof(struct mpc_config_intsrc);
 966                }
 967                print_mp_irq_info(&mp_irqs[i]);
 968        }
 969#endif
 970out:
 971        /* update checksum */
 972        mpc->mpc_checksum = 0;
 973        mpc->mpc_checksum -= mpf_checksum((unsigned char *)mpc,
 974                                           mpc->mpc_length);
 975
 976        return 0;
 977}
 978
 979static int __initdata enable_update_mptable;
 980
 981static int __init update_mptable_setup(char *str)
 982{
 983        enable_update_mptable = 1;
 984        return 0;
 985}
 986early_param("update_mptable", update_mptable_setup);
 987
 988static unsigned long __initdata mpc_new_phys;
 989static unsigned long mpc_new_length __initdata = 4096;
 990
 991/* alloc_mptable or alloc_mptable=4k */
 992static int __initdata alloc_mptable;
 993static int __init parse_alloc_mptable_opt(char *p)
 994{
 995        enable_update_mptable = 1;
 996        alloc_mptable = 1;
 997        if (!p)
 998                return 0;
 999        mpc_new_length = memparse(p, &p);
1000        return 0;
1001}
1002early_param("alloc_mptable", parse_alloc_mptable_opt);
1003
1004void __init early_reserve_e820_mpc_new(void)
1005{
1006        if (enable_update_mptable && alloc_mptable) {
1007                u64 startt = 0;
1008#ifdef CONFIG_X86_TRAMPOLINE
1009                startt = TRAMPOLINE_BASE;
1010#endif
1011                mpc_new_phys = early_reserve_e820(startt, mpc_new_length, 4);
1012        }
1013}
1014
1015static int __init update_mp_table(void)
1016{
1017        char str[16];
1018        char oem[10];
1019        struct intel_mp_floating *mpf;
1020        struct mp_config_table *mpc;
1021        struct mp_config_table *mpc_new;
1022
1023        if (!enable_update_mptable)
1024                return 0;
1025
1026        mpf = mpf_found;
1027        if (!mpf)
1028                return 0;
1029
1030        /*
1031         * Now see if we need to go further.
1032         */
1033        if (mpf->mpf_feature1 != 0)
1034                return 0;
1035
1036        if (!mpf->mpf_physptr)
1037                return 0;
1038
1039        mpc = phys_to_virt(mpf->mpf_physptr);
1040
1041        if (!smp_check_mpc(mpc, oem, str))
1042                return 0;
1043
1044        printk(KERN_INFO "mpf: %lx\n", virt_to_phys(mpf));
1045        printk(KERN_INFO "mpf_physptr: %x\n", mpf->mpf_physptr);
1046
1047        if (mpc_new_phys && mpc->mpc_length > mpc_new_length) {
1048                mpc_new_phys = 0;
1049                printk(KERN_INFO "mpc_new_length is %ld, please use alloc_mptable=8k\n",
1050                         mpc_new_length);
1051        }
1052
1053        if (!mpc_new_phys) {
1054                unsigned char old, new;
1055                /* check if we can change the postion */
1056                mpc->mpc_checksum = 0;
1057                old = mpf_checksum((unsigned char *)mpc, mpc->mpc_length);
1058                mpc->mpc_checksum = 0xff;
1059                new = mpf_checksum((unsigned char *)mpc, mpc->mpc_length);
1060                if (old == new) {
1061                        printk(KERN_INFO "mpc is readonly, please try alloc_mptable instead\n");
1062                        return 0;
1063                }
1064                printk(KERN_INFO "use in-positon replacing\n");
1065        } else {
1066                mpf->mpf_physptr = mpc_new_phys;
1067                mpc_new = phys_to_virt(mpc_new_phys);
1068                memcpy(mpc_new, mpc, mpc->mpc_length);
1069                mpc = mpc_new;
1070                /* check if we can modify that */
1071                if (mpc_new_phys - mpf->mpf_physptr) {
1072                        struct intel_mp_floating *mpf_new;
1073                        /* steal 16 bytes from [0, 1k) */
1074                        printk(KERN_INFO "mpf new: %x\n", 0x400 - 16);
1075                        mpf_new = phys_to_virt(0x400 - 16);
1076                        memcpy(mpf_new, mpf, 16);
1077                        mpf = mpf_new;
1078                        mpf->mpf_physptr = mpc_new_phys;
1079                }
1080                mpf->mpf_checksum = 0;
1081                mpf->mpf_checksum -= mpf_checksum((unsigned char *)mpf, 16);
1082                printk(KERN_INFO "mpf_physptr new: %x\n", mpf->mpf_physptr);
1083        }
1084
1085        /*
1086         * only replace the one with mp_INT and
1087         *       MP_IRQ_TRIGGER_LEVEL|MP_IRQ_POLARITY_LOW,
1088         * already in mp_irqs , stored by ... and mp_config_acpi_gsi,
1089         * may need pci=routeirq for all coverage
1090         */
1091        replace_intsrc_all(mpc, mpc_new_phys, mpc_new_length);
1092
1093        return 0;
1094}
1095
1096late_initcall(update_mp_table);
1097
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.