mpparse.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:21k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * Intel Multiprocessor Specificiation 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.  *
  8.  * Fixes
  9.  * Erich Boleyn : MP v1.4 and additional changes.
  10.  * Alan Cox : Added EBDA scanning
  11.  * Ingo Molnar : various cleanups and rewrites
  12.  * Maciej W. Rozycki : Bits for default MP configurations
  13.  */
  14. #include <linux/mm.h>
  15. #include <linux/irq.h>
  16. #include <linux/init.h>
  17. #include <linux/delay.h>
  18. #include <linux/config.h>
  19. #include <linux/bootmem.h>
  20. #include <linux/smp_lock.h>
  21. #include <linux/kernel_stat.h>
  22. #include <linux/mc146818rtc.h>
  23. #include <asm/smp.h>
  24. #include <asm/mtrr.h>
  25. #include <asm/mpspec.h>
  26. #include <asm/pgalloc.h>
  27. /* Have we found an MP table */
  28. int smp_found_config;
  29. /*
  30.  * Various Linux-internal data structures created from the
  31.  * MP-table.
  32.  */
  33. int apic_version [MAX_APICS];
  34. int mp_bus_id_to_type [MAX_MP_BUSSES];
  35. int mp_bus_id_to_node [MAX_MP_BUSSES];
  36. int mp_bus_id_to_pci_bus [MAX_MP_BUSSES] = { [0 ... MAX_MP_BUSSES-1] = -1 };
  37. int mp_current_pci_id;
  38. /* I/O APIC entries */
  39. struct mpc_config_ioapic mp_ioapics[MAX_IO_APICS];
  40. /* # of MP IRQ source entries */
  41. struct mpc_config_intsrc mp_irqs[MAX_IRQ_SOURCES];
  42. /* MP IRQ source entries */
  43. int mp_irq_entries;
  44. int nr_ioapics;
  45. int pic_mode;
  46. unsigned long mp_lapic_addr;
  47. /* Processor that is doing the boot up */
  48. unsigned int boot_cpu_physical_apicid = -1U;
  49. unsigned int boot_cpu_logical_apicid = -1U;
  50. /* Internal processor count */
  51. static unsigned int num_processors;
  52. /* Bitmask of physically existing CPUs */
  53. unsigned long phys_cpu_present_map;
  54. /*
  55.  * Intel MP BIOS table parsing routines:
  56.  */
  57. #ifndef CONFIG_X86_VISWS_APIC
  58. /*
  59.  * Checksum an MP configuration block.
  60.  */
  61. static int __init mpf_checksum(unsigned char *mp, int len)
  62. {
  63. int sum = 0;
  64. while (len--)
  65. sum += *mp++;
  66. return sum & 0xFF;
  67. }
  68. /*
  69.  * Processor encoding in an MP configuration block
  70.  */
  71. static char __init *mpc_family(int family,int model)
  72. {
  73. static char n[32];
  74. static char *model_defs[]=
  75. {
  76. "80486DX","80486DX",
  77. "80486SX","80486DX/2 or 80487",
  78. "80486SL","80486SX/2",
  79. "Unknown","80486DX/2-WB",
  80. "80486DX/4","80486DX/4-WB"
  81. };
  82. switch (family) {
  83. case 0x04:
  84. if (model < 10)
  85. return model_defs[model];
  86. break;
  87. case 0x05:
  88. return("Pentium(tm)");
  89. case 0x06:
  90. return("Pentium(tm) Pro");
  91. case 0x0F:
  92. if (model == 0x00)
  93. return("Pentium 4(tm)");
  94. if (model == 0x0F)
  95. return("Special controller");
  96. }
  97. sprintf(n,"Unknown CPU [%d:%d]",family, model);
  98. return n;
  99. }
  100. #ifdef CONFIG_X86_IO_APIC
  101. extern int have_acpi_tables; /* set by acpitable.c */
  102. #else
  103. #define have_acpi_tables (0)
  104. #endif
  105. /* 
  106.  * Have to match translation table entries to main table entries by counter
  107.  * hence the mpc_record variable .... can't see a less disgusting way of
  108.  * doing this ....
  109.  */
  110. static int mpc_record; 
  111. static struct mpc_config_translation *translation_table[MAX_MPC_ENTRY] __initdata;
  112. void __init MP_processor_info (struct mpc_config_processor *m)
  113. {
  114.   int ver, quad, logical_apicid;
  115.  
  116. if (!(m->mpc_cpuflag & CPU_ENABLED))
  117. return;
  118. logical_apicid = m->mpc_apicid;
  119. if (clustered_apic_mode) {
  120. quad = translation_table[mpc_record]->trans_quad;
  121. logical_apicid = (quad << 4) + 
  122. (m->mpc_apicid ? m->mpc_apicid << 1 : 1);
  123. printk("Processor #%d %s APIC version %d (quad %d, apic %d)n",
  124. m->mpc_apicid,
  125. mpc_family((m->mpc_cpufeature & CPU_FAMILY_MASK)>>8 ,
  126.    (m->mpc_cpufeature & CPU_MODEL_MASK)>>4),
  127. m->mpc_apicver, quad, logical_apicid);
  128. } else {
  129. printk("Processor #%d %s APIC version %dn",
  130. m->mpc_apicid,
  131. mpc_family((m->mpc_cpufeature & CPU_FAMILY_MASK)>>8 ,
  132.    (m->mpc_cpufeature & CPU_MODEL_MASK)>>4),
  133. m->mpc_apicver);
  134. }
  135. if (m->mpc_featureflag&(1<<0))
  136. Dprintk("    Floating point unit present.n");
  137. if (m->mpc_featureflag&(1<<7))
  138. Dprintk("    Machine Exception supported.n");
  139. if (m->mpc_featureflag&(1<<8))
  140. Dprintk("    64 bit compare & exchange supported.n");
  141. if (m->mpc_featureflag&(1<<9))
  142. Dprintk("    Internal APIC present.n");
  143. if (m->mpc_featureflag&(1<<11))
  144. Dprintk("    SEP present.n");
  145. if (m->mpc_featureflag&(1<<12))
  146. Dprintk("    MTRR  present.n");
  147. if (m->mpc_featureflag&(1<<13))
  148. Dprintk("    PGE  present.n");
  149. if (m->mpc_featureflag&(1<<14))
  150. Dprintk("    MCA  present.n");
  151. if (m->mpc_featureflag&(1<<15))
  152. Dprintk("    CMOV  present.n");
  153. if (m->mpc_featureflag&(1<<16))
  154. Dprintk("    PAT  present.n");
  155. if (m->mpc_featureflag&(1<<17))
  156. Dprintk("    PSE  present.n");
  157. if (m->mpc_featureflag&(1<<18))
  158. Dprintk("    PSN  present.n");
  159. if (m->mpc_featureflag&(1<<19))
  160. Dprintk("    Cache Line Flush Instruction present.n");
  161. /* 20 Reserved */
  162. if (m->mpc_featureflag&(1<<21))
  163. Dprintk("    Debug Trace and EMON Store present.n");
  164. if (m->mpc_featureflag&(1<<22))
  165. Dprintk("    ACPI Thermal Throttle Registers  present.n");
  166. if (m->mpc_featureflag&(1<<23))
  167. Dprintk("    MMX  present.n");
  168. if (m->mpc_featureflag&(1<<24))
  169. Dprintk("    FXSR  present.n");
  170. if (m->mpc_featureflag&(1<<25))
  171. Dprintk("    XMM  present.n");
  172. if (m->mpc_featureflag&(1<<26))
  173. Dprintk("    Willamette New Instructions  present.n");
  174. if (m->mpc_featureflag&(1<<27))
  175. Dprintk("    Self Snoop  present.n");
  176. if (m->mpc_featureflag&(1<<28))
  177. Dprintk("    HT  present.n");
  178. if (m->mpc_featureflag&(1<<29))
  179. Dprintk("    Thermal Monitor present.n");
  180. /* 30, 31 Reserved */
  181. if (m->mpc_cpuflag & CPU_BOOTPROCESSOR) {
  182. Dprintk("    Bootup CPUn");
  183. boot_cpu_physical_apicid = m->mpc_apicid;
  184. boot_cpu_logical_apicid = logical_apicid;
  185. }
  186. num_processors++;
  187. if (m->mpc_apicid > MAX_APICS) {
  188. printk("Processor #%d INVALID. (Max ID: %d).n",
  189. m->mpc_apicid, MAX_APICS);
  190. return;
  191. }
  192. ver = m->mpc_apicver;
  193. if (clustered_apic_mode) {
  194. phys_cpu_present_map |= (logical_apicid&0xf) << (4*quad);
  195. } else {
  196. phys_cpu_present_map |= 1 << m->mpc_apicid;
  197. }
  198. /*
  199.  * Validate version
  200.  */
  201. if (ver == 0x0) {
  202. printk("BIOS bug, APIC version is 0 for CPU#%d! fixing up to 0x10. (tell your hw vendor)n", m->mpc_apicid);
  203. ver = 0x10;
  204. }
  205. apic_version[m->mpc_apicid] = ver;
  206. }
  207. static void __init MP_bus_info (struct mpc_config_bus *m)
  208. {
  209. char str[7];
  210. memcpy(str, m->mpc_bustype, 6);
  211. str[6] = 0;
  212. if (clustered_apic_mode) {
  213. mp_bus_id_to_node[m->mpc_busid] = translation_table[mpc_record]->trans_quad;
  214. printk("Bus #%d is %s (node %d)n", m->mpc_busid, str, mp_bus_id_to_node[m->mpc_busid]);
  215. } else {
  216. Dprintk("Bus #%d is %sn", m->mpc_busid, str);
  217. }
  218. if (strncmp(str, BUSTYPE_ISA, sizeof(BUSTYPE_ISA)-1) == 0) {
  219. mp_bus_id_to_type[m->mpc_busid] = MP_BUS_ISA;
  220. } else if (strncmp(str, BUSTYPE_EISA, sizeof(BUSTYPE_EISA)-1) == 0) {
  221. mp_bus_id_to_type[m->mpc_busid] = MP_BUS_EISA;
  222. } else if (strncmp(str, BUSTYPE_PCI, sizeof(BUSTYPE_PCI)-1) == 0) {
  223. mp_bus_id_to_type[m->mpc_busid] = MP_BUS_PCI;
  224. mp_bus_id_to_pci_bus[m->mpc_busid] = mp_current_pci_id;
  225. mp_current_pci_id++;
  226. } else if (strncmp(str, BUSTYPE_MCA, sizeof(BUSTYPE_MCA)-1) == 0) {
  227. mp_bus_id_to_type[m->mpc_busid] = MP_BUS_MCA;
  228. } else {
  229. printk("Unknown bustype %s - ignoringn", str);
  230. }
  231. }
  232. static void __init MP_ioapic_info (struct mpc_config_ioapic *m)
  233. {
  234. if (!(m->mpc_flags & MPC_APIC_USABLE))
  235. return;
  236. printk("I/O APIC #%d Version %d at 0x%lX.n",
  237. m->mpc_apicid, m->mpc_apicver, m->mpc_apicaddr);
  238. if (nr_ioapics >= MAX_IO_APICS) {
  239. printk("Max # of I/O APICs (%d) exceeded (found %d).n",
  240. MAX_IO_APICS, nr_ioapics);
  241. panic("Recompile kernel with bigger MAX_IO_APICS!.n");
  242. }
  243. if (!m->mpc_apicaddr) {
  244. printk(KERN_ERR "WARNING: bogus zero I/O APIC address"
  245. " found in MP table, skipping!n");
  246. return;
  247. }
  248. mp_ioapics[nr_ioapics] = *m;
  249. nr_ioapics++;
  250. }
  251. static void __init MP_intsrc_info (struct mpc_config_intsrc *m)
  252. {
  253. mp_irqs [mp_irq_entries] = *m;
  254. Dprintk("Int: type %d, pol %d, trig %d, bus %d,"
  255. " IRQ %02x, APIC ID %x, APIC INT %02xn",
  256. m->mpc_irqtype, m->mpc_irqflag & 3,
  257. (m->mpc_irqflag >> 2) & 3, m->mpc_srcbus,
  258. m->mpc_srcbusirq, m->mpc_dstapic, m->mpc_dstirq);
  259. if (++mp_irq_entries == MAX_IRQ_SOURCES)
  260. panic("Max # of irq sources exceeded!!n");
  261. }
  262. static void __init MP_lintsrc_info (struct mpc_config_lintsrc *m)
  263. {
  264. Dprintk("Lint: type %d, pol %d, trig %d, bus %d,"
  265. " IRQ %02x, APIC ID %x, APIC LINT %02xn",
  266. m->mpc_irqtype, m->mpc_irqflag & 3,
  267. (m->mpc_irqflag >> 2) &3, m->mpc_srcbusid,
  268. m->mpc_srcbusirq, m->mpc_destapic, m->mpc_destapiclint);
  269. /*
  270.  * Well it seems all SMP boards in existence
  271.  * use ExtINT/LVT1 == LINT0 and
  272.  * NMI/LVT2 == LINT1 - the following check
  273.  * will show us if this assumptions is false.
  274.  * Until then we do not have to add baggage.
  275.  */
  276. if ((m->mpc_irqtype == mp_ExtINT) &&
  277. (m->mpc_destapiclint != 0))
  278. BUG();
  279. if ((m->mpc_irqtype == mp_NMI) &&
  280. (m->mpc_destapiclint != 1))
  281. BUG();
  282. }
  283. static void __init MP_translation_info (struct mpc_config_translation *m)
  284. {
  285. printk("Translation: record %d, type %d, quad %d, global %d, local %dn", mpc_record, m->trans_type, 
  286. m->trans_quad, m->trans_global, m->trans_local);
  287. if (mpc_record >= MAX_MPC_ENTRY) 
  288. printk("MAX_MPC_ENTRY exceeded!n");
  289. else
  290. translation_table[mpc_record] = m; /* stash this for later */
  291. }
  292. /*
  293.  * Read/parse the MPC oem tables
  294.  */
  295. static void __init smp_read_mpc_oem(struct mp_config_oemtable *oemtable, 
  296. unsigned short oemsize)
  297. {
  298. int count = sizeof (*oemtable); /* the header size */
  299. unsigned char *oemptr = ((unsigned char *)oemtable)+count;
  300. printk("Found an OEM MPC table at %8p - parsing it ... n", oemtable);
  301. if (memcmp(oemtable->oem_signature,MPC_OEM_SIGNATURE,4))
  302. {
  303. printk("SMP mpc oemtable: bad signature [%c%c%c%c]!n",
  304. oemtable->oem_signature[0],
  305. oemtable->oem_signature[1],
  306. oemtable->oem_signature[2],
  307. oemtable->oem_signature[3]);
  308. return;
  309. }
  310. if (mpf_checksum((unsigned char *)oemtable,oemtable->oem_length))
  311. {
  312. printk("SMP oem mptable: checksum error!n");
  313. return;
  314. }
  315. while (count < oemtable->oem_length) {
  316. switch (*oemptr) {
  317. case MP_TRANSLATION:
  318. {
  319. struct mpc_config_translation *m=
  320. (struct mpc_config_translation *)oemptr;
  321. MP_translation_info(m);
  322. oemptr += sizeof(*m);
  323. count += sizeof(*m);
  324. ++mpc_record;
  325. break;
  326. }
  327. default:
  328. {
  329. printk("Unrecognised OEM table entry type! - %dn", (int) *oemptr);
  330. return;
  331. }
  332. }
  333.        }
  334. }
  335. /*
  336.  * Read/parse the MPC
  337.  */
  338. static int __init smp_read_mpc(struct mp_config_table *mpc)
  339. {
  340. char str[16];
  341. int count=sizeof(*mpc);
  342. unsigned char *mpt=((unsigned char *)mpc)+count;
  343. if (memcmp(mpc->mpc_signature,MPC_SIGNATURE,4)) {
  344. panic("SMP mptable: bad signature [%c%c%c%c]!n",
  345. mpc->mpc_signature[0],
  346. mpc->mpc_signature[1],
  347. mpc->mpc_signature[2],
  348. mpc->mpc_signature[3]);
  349. return 0;
  350. }
  351. if (mpf_checksum((unsigned char *)mpc,mpc->mpc_length)) {
  352. panic("SMP mptable: checksum error!n");
  353. return 0;
  354. }
  355. if (mpc->mpc_spec!=0x01 && mpc->mpc_spec!=0x04) {
  356. printk(KERN_ERR "SMP mptable: bad table version (%d)!!n",
  357. mpc->mpc_spec);
  358. return 0;
  359. }
  360. if (!mpc->mpc_lapic) {
  361. printk(KERN_ERR "SMP mptable: null local APIC address!n");
  362. return 0;
  363. }
  364. memcpy(str,mpc->mpc_oem,8);
  365. str[8]=0;
  366. printk("OEM ID: %s ",str);
  367. memcpy(str,mpc->mpc_productid,12);
  368. str[12]=0;
  369. printk("Product ID: %s ",str);
  370. printk("APIC at: 0x%lXn",mpc->mpc_lapic);
  371. /* save the local APIC address, it might be non-default,
  372.  * but only if we're not using the ACPI tables
  373.  */
  374. if (!have_acpi_tables)
  375. mp_lapic_addr = mpc->mpc_lapic;
  376. if (clustered_apic_mode && mpc->mpc_oemptr) {
  377. /* We need to process the oem mpc tables to tell us which quad things are in ... */
  378. mpc_record = 0;
  379. smp_read_mpc_oem((struct mp_config_oemtable *) mpc->mpc_oemptr, mpc->mpc_oemsize);
  380. mpc_record = 0;
  381. }
  382. /*
  383.  * Now process the configuration blocks.
  384.  */
  385. while (count < mpc->mpc_length) {
  386. switch(*mpt) {
  387. case MP_PROCESSOR:
  388. {
  389. struct mpc_config_processor *m=
  390. (struct mpc_config_processor *)mpt;
  391. /* ACPI may already have provided this one for us */
  392. if (!have_acpi_tables)
  393. MP_processor_info(m);
  394. mpt += sizeof(*m);
  395. count += sizeof(*m);
  396. break;
  397. }
  398. case MP_BUS:
  399. {
  400. struct mpc_config_bus *m=
  401. (struct mpc_config_bus *)mpt;
  402. MP_bus_info(m);
  403. mpt += sizeof(*m);
  404. count += sizeof(*m);
  405. break;
  406. }
  407. case MP_IOAPIC:
  408. {
  409. struct mpc_config_ioapic *m=
  410. (struct mpc_config_ioapic *)mpt;
  411. MP_ioapic_info(m);
  412. mpt+=sizeof(*m);
  413. count+=sizeof(*m);
  414. break;
  415. }
  416. case MP_INTSRC:
  417. {
  418. struct mpc_config_intsrc *m=
  419. (struct mpc_config_intsrc *)mpt;
  420. MP_intsrc_info(m);
  421. mpt+=sizeof(*m);
  422. count+=sizeof(*m);
  423. break;
  424. }
  425. case MP_LINTSRC:
  426. {
  427. struct mpc_config_lintsrc *m=
  428. (struct mpc_config_lintsrc *)mpt;
  429. MP_lintsrc_info(m);
  430. mpt+=sizeof(*m);
  431. count+=sizeof(*m);
  432. break;
  433. }
  434. default:
  435. {
  436. count = mpc->mpc_length;
  437. break;
  438. }
  439. }
  440. ++mpc_record;
  441. }
  442. if (clustered_apic_mode && nr_ioapics > 2) {
  443. /* don't initialise IO apics on secondary quads */
  444. nr_ioapics = 2;
  445. }
  446. if (!num_processors)
  447. printk(KERN_ERR "SMP mptable: no processors registered!n");
  448. return num_processors;
  449. }
  450. static int __init ELCR_trigger(unsigned int irq)
  451. {
  452. unsigned int port;
  453. port = 0x4d0 + (irq >> 3);
  454. return (inb(port) >> (irq & 7)) & 1;
  455. }
  456. static void __init construct_default_ioirq_mptable(int mpc_default_type)
  457. {
  458. struct mpc_config_intsrc intsrc;
  459. int i;
  460. int ELCR_fallback = 0;
  461. intsrc.mpc_type = MP_INTSRC;
  462. intsrc.mpc_irqflag = 0; /* conforming */
  463. intsrc.mpc_srcbus = 0;
  464. intsrc.mpc_dstapic = mp_ioapics[0].mpc_apicid;
  465. intsrc.mpc_irqtype = mp_INT;
  466. /*
  467.  *  If true, we have an ISA/PCI system with no IRQ entries
  468.  *  in the MP table. To prevent the PCI interrupts from being set up
  469.  *  incorrectly, we try to use the ELCR. The sanity check to see if
  470.  *  there is good ELCR data is very simple - IRQ0, 1, 2 and 13 can
  471.  *  never be level sensitive, so we simply see if the ELCR agrees.
  472.  *  If it does, we assume it's valid.
  473.  */
  474. if (mpc_default_type == 5) {
  475. printk("ISA/PCI bus type with no IRQ information... falling back to ELCRn");
  476. if (ELCR_trigger(0) || ELCR_trigger(1) || ELCR_trigger(2) || ELCR_trigger(13))
  477. printk("ELCR contains invalid data... not using ELCRn");
  478. else {
  479. printk("Using ELCR to identify PCI interruptsn");
  480. ELCR_fallback = 1;
  481. }
  482. }
  483. for (i = 0; i < 16; i++) {
  484. switch (mpc_default_type) {
  485. case 2:
  486. if (i == 0 || i == 13)
  487. continue; /* IRQ0 & IRQ13 not connected */
  488. /* fall through */
  489. default:
  490. if (i == 2)
  491. continue; /* IRQ2 is never connected */
  492. }
  493. if (ELCR_fallback) {
  494. /*
  495.  *  If the ELCR indicates a level-sensitive interrupt, we
  496.  *  copy that information over to the MP table in the
  497.  *  irqflag field (level sensitive, active high polarity).
  498.  */
  499. if (ELCR_trigger(i))
  500. intsrc.mpc_irqflag = 13;
  501. else
  502. intsrc.mpc_irqflag = 0;
  503. }
  504. intsrc.mpc_srcbusirq = i;
  505. intsrc.mpc_dstirq = i ? i : 2; /* IRQ0 to INTIN2 */
  506. MP_intsrc_info(&intsrc);
  507. }
  508. intsrc.mpc_irqtype = mp_ExtINT;
  509. intsrc.mpc_srcbusirq = 0;
  510. intsrc.mpc_dstirq = 0; /* 8259A to INTIN0 */
  511. MP_intsrc_info(&intsrc);
  512. }
  513. static inline void __init construct_default_ISA_mptable(int mpc_default_type)
  514. {
  515. struct mpc_config_processor processor;
  516. struct mpc_config_bus bus;
  517. struct mpc_config_ioapic ioapic;
  518. struct mpc_config_lintsrc lintsrc;
  519. int linttypes[2] = { mp_ExtINT, mp_NMI };
  520. int i;
  521. /*
  522.  * local APIC has default address
  523.  */
  524. mp_lapic_addr = APIC_DEFAULT_PHYS_BASE;
  525. /*
  526.  * 2 CPUs, numbered 0 & 1.
  527.  */
  528. processor.mpc_type = MP_PROCESSOR;
  529. /* Either an integrated APIC or a discrete 82489DX. */
  530. processor.mpc_apicver = mpc_default_type > 4 ? 0x10 : 0x01;
  531. processor.mpc_cpuflag = CPU_ENABLED;
  532. processor.mpc_cpufeature = (boot_cpu_data.x86 << 8) |
  533.    (boot_cpu_data.x86_model << 4) |
  534.    boot_cpu_data.x86_mask;
  535. processor.mpc_featureflag = boot_cpu_data.x86_capability[0];
  536. processor.mpc_reserved[0] = 0;
  537. processor.mpc_reserved[1] = 0;
  538. for (i = 0; i < 2; i++) {
  539. processor.mpc_apicid = i;
  540. MP_processor_info(&processor);
  541. }
  542. bus.mpc_type = MP_BUS;
  543. bus.mpc_busid = 0;
  544. switch (mpc_default_type) {
  545. default:
  546. printk("???nUnknown standard configuration %dn",
  547. mpc_default_type);
  548. /* fall through */
  549. case 1:
  550. case 5:
  551. memcpy(bus.mpc_bustype, "ISA   ", 6);
  552. break;
  553. case 2:
  554. case 6:
  555. case 3:
  556. memcpy(bus.mpc_bustype, "EISA  ", 6);
  557. break;
  558. case 4:
  559. case 7:
  560. memcpy(bus.mpc_bustype, "MCA   ", 6);
  561. }
  562. MP_bus_info(&bus);
  563. if (mpc_default_type > 4) {
  564. bus.mpc_busid = 1;
  565. memcpy(bus.mpc_bustype, "PCI   ", 6);
  566. MP_bus_info(&bus);
  567. }
  568. ioapic.mpc_type = MP_IOAPIC;
  569. ioapic.mpc_apicid = 2;
  570. ioapic.mpc_apicver = mpc_default_type > 4 ? 0x10 : 0x01;
  571. ioapic.mpc_flags = MPC_APIC_USABLE;
  572. ioapic.mpc_apicaddr = 0xFEC00000;
  573. MP_ioapic_info(&ioapic);
  574. /*
  575.  * We set up most of the low 16 IO-APIC pins according to MPS rules.
  576.  */
  577. construct_default_ioirq_mptable(mpc_default_type);
  578. lintsrc.mpc_type = MP_LINTSRC;
  579. lintsrc.mpc_irqflag = 0; /* conforming */
  580. lintsrc.mpc_srcbusid = 0;
  581. lintsrc.mpc_srcbusirq = 0;
  582. lintsrc.mpc_destapic = MP_APIC_ALL;
  583. for (i = 0; i < 2; i++) {
  584. lintsrc.mpc_irqtype = linttypes[i];
  585. lintsrc.mpc_destapiclint = i;
  586. MP_lintsrc_info(&lintsrc);
  587. }
  588. }
  589. static struct intel_mp_floating *mpf_found;
  590. extern void  config_acpi_tables(void);
  591. /*
  592.  * Scan the memory blocks for an SMP configuration block.
  593.  */
  594. void __init get_smp_config (void)
  595. {
  596. struct intel_mp_floating *mpf = mpf_found;
  597. #ifdef CONFIG_X86_IO_APIC
  598. /*
  599.  * Check if the ACPI tables are provided. Use them only to get
  600.  * the processor information, mainly because it provides
  601.  * the info on the logical processor(s), rather than the physical
  602.  * processor(s) that are provided by the MPS. We attempt to 
  603.  * check only if the user provided a commandline override
  604.  */
  605. config_acpi_tables();
  606. #endif
  607. printk("Intel MultiProcessor Specification v1.%dn", mpf->mpf_specification);
  608. if (mpf->mpf_feature2 & (1<<7)) {
  609. printk("    IMCR and PIC compatibility mode.n");
  610. pic_mode = 1;
  611. } else {
  612. printk("    Virtual Wire compatibility mode.n");
  613. pic_mode = 0;
  614. }
  615. /*
  616.  * Now see if we need to read further.
  617.  */
  618. if (mpf->mpf_feature1 != 0) {
  619. printk("Default MP configuration #%dn", mpf->mpf_feature1);
  620. construct_default_ISA_mptable(mpf->mpf_feature1);
  621. } else if (mpf->mpf_physptr) {
  622. /*
  623.  * Read the physical hardware table.  Anything here will
  624.  * override the defaults.
  625.  */
  626. if (!smp_read_mpc((void *)mpf->mpf_physptr)) {
  627. smp_found_config = 0;
  628. printk(KERN_ERR "BIOS bug, MP table errors detected!...n");
  629. printk(KERN_ERR "... disabling SMP support. (tell your hw vendor)n");
  630. return;
  631. }
  632. /*
  633.  * If there are no explicit MP IRQ entries, then we are
  634.  * broken.  We set up most of the low 16 IO-APIC pins to
  635.  * ISA defaults and hope it will work.
  636.  */
  637. if (!mp_irq_entries) {
  638. struct mpc_config_bus bus;
  639. printk("BIOS bug, no explicit IRQ entries, using default mptable. (tell your hw vendor)n");
  640. bus.mpc_type = MP_BUS;
  641. bus.mpc_busid = 0;
  642. memcpy(bus.mpc_bustype, "ISA   ", 6);
  643. MP_bus_info(&bus);
  644. construct_default_ioirq_mptable(0);
  645. }
  646. } else
  647. BUG();
  648. printk("Processors: %dn", num_processors);
  649. /*
  650.  * Only use the first configuration found.
  651.  */
  652. }
  653. static int __init smp_scan_config (unsigned long base, unsigned long length)
  654. {
  655. unsigned long *bp = phys_to_virt(base);
  656. struct intel_mp_floating *mpf;
  657. Dprintk("Scan SMP from %p for %ld bytes.n", bp,length);
  658. if (sizeof(*mpf) != 16)
  659. printk("Error: MPF sizen");
  660. while (length > 0) {
  661. mpf = (struct intel_mp_floating *)bp;
  662. if ((*bp == SMP_MAGIC_IDENT) &&
  663. (mpf->mpf_length == 1) &&
  664. !mpf_checksum((unsigned char *)bp, 16) &&
  665. ((mpf->mpf_specification == 1)
  666. || (mpf->mpf_specification == 4)) ) {
  667. smp_found_config = 1;
  668. printk("found SMP MP-table at %08lxn",
  669. virt_to_phys(mpf));
  670. reserve_bootmem(virt_to_phys(mpf), PAGE_SIZE);
  671. if (mpf->mpf_physptr)
  672. reserve_bootmem(mpf->mpf_physptr, PAGE_SIZE);
  673. mpf_found = mpf;
  674. return 1;
  675. }
  676. bp += 4;
  677. length -= 16;
  678. }
  679. return 0;
  680. }
  681. void __init find_intel_smp (void)
  682. {
  683. unsigned int address;
  684. /*
  685.  * FIXME: Linux assumes you have 640K of base ram..
  686.  * this continues the error...
  687.  *
  688.  * 1) Scan the bottom 1K for a signature
  689.  * 2) Scan the top 1K of base RAM
  690.  * 3) Scan the 64K of bios
  691.  */
  692. if (smp_scan_config(0x0,0x400) ||
  693. smp_scan_config(639*0x400,0x400) ||
  694. smp_scan_config(0xF0000,0x10000))
  695. return;
  696. /*
  697.  * If it is an SMP machine we should know now, unless the
  698.  * configuration is in an EISA/MCA bus machine with an
  699.  * extended bios data area.
  700.  *
  701.  * there is a real-mode segmented pointer pointing to the
  702.  * 4K EBDA area at 0x40E, calculate and scan it here.
  703.  *
  704.  * NOTE! There are Linux loaders that will corrupt the EBDA
  705.  * area, and as such this kind of SMP config may be less
  706.  * trustworthy, simply because the SMP table may have been
  707.  * stomped on during early boot. These loaders are buggy and
  708.  * should be fixed.
  709.  */
  710. address = *(unsigned short *)phys_to_virt(0x40E);
  711. address <<= 4;
  712. smp_scan_config(address, 0x1000);
  713. if (smp_found_config)
  714. printk(KERN_WARNING "WARNING: MP table in the EBDA can be UNSAFE, contact linux-smp@vger.kernel.org if you experience SMP problems!n");
  715. }
  716. #else
  717. /*
  718.  * The Visual Workstation is Intel MP compliant in the hardware
  719.  * sense, but it doesnt have a BIOS(-configuration table).
  720.  * No problem for Linux.
  721.  */
  722. void __init find_visws_smp(void)
  723. {
  724. smp_found_config = 1;
  725. phys_cpu_present_map |= 2; /* or in id 1 */
  726. apic_version[1] |= 0x10; /* integrated APIC */
  727. apic_version[0] |= 0x10;
  728. mp_lapic_addr = APIC_DEFAULT_PHYS_BASE;
  729. }
  730. #endif
  731. /*
  732.  * - Intel MP Configuration Table
  733.  * - or SGI Visual Workstation configuration
  734.  */
  735. void __init find_smp_config (void)
  736. {
  737. #ifdef CONFIG_X86_LOCAL_APIC
  738. find_intel_smp();
  739. #endif
  740. #ifdef CONFIG_VISWS
  741. find_visws_smp();
  742. #endif
  743. }