diff options
Diffstat (limited to 'arch/x86/kernel/mpparse.c')
| -rw-r--r-- | arch/x86/kernel/mpparse.c | 170 | 
1 files changed, 34 insertions, 136 deletions
diff --git a/arch/x86/kernel/mpparse.c b/arch/x86/kernel/mpparse.c index 9af64d9c4b6..d2b56489d70 100644 --- a/arch/x86/kernel/mpparse.c +++ b/arch/x86/kernel/mpparse.c @@ -27,7 +27,6 @@  #include <asm/proto.h>  #include <asm/bios_ebda.h>  #include <asm/e820.h> -#include <asm/trampoline.h>  #include <asm/setup.h>  #include <asm/smp.h> @@ -95,9 +94,9 @@ static void __init MP_bus_info(struct mpc_bus *m)  	}  #endif +	set_bit(m->busid, mp_bus_not_pci);  	if (strncmp(str, BUSTYPE_ISA, sizeof(BUSTYPE_ISA) - 1) == 0) { -		set_bit(m->busid, mp_bus_not_pci); -#if defined(CONFIG_EISA) || defined(CONFIG_MCA) +#ifdef CONFIG_EISA  		mp_bus_id_to_type[m->busid] = MP_BUS_ISA;  #endif  	} else if (strncmp(str, BUSTYPE_PCI, sizeof(BUSTYPE_PCI) - 1) == 0) { @@ -105,12 +104,10 @@ static void __init MP_bus_info(struct mpc_bus *m)  			x86_init.mpparse.mpc_oem_pci_bus(m);  		clear_bit(m->busid, mp_bus_not_pci); -#if defined(CONFIG_EISA) || defined(CONFIG_MCA) +#ifdef CONFIG_EISA  		mp_bus_id_to_type[m->busid] = MP_BUS_PCI;  	} else if (strncmp(str, BUSTYPE_EISA, sizeof(BUSTYPE_EISA) - 1) == 0) {  		mp_bus_id_to_type[m->busid] = MP_BUS_EISA; -	} else if (strncmp(str, BUSTYPE_MCA, sizeof(BUSTYPE_MCA) - 1) == 0) { -		mp_bus_id_to_type[m->busid] = MP_BUS_MCA;  #endif  	} else  		printk(KERN_WARNING "Unknown bustype %s - ignoring\n", str); @@ -118,21 +115,8 @@ static void __init MP_bus_info(struct mpc_bus *m)  static void __init MP_ioapic_info(struct mpc_ioapic *m)  { -	if (!(m->flags & MPC_APIC_USABLE)) -		return; - -	printk(KERN_INFO "I/O APIC #%d Version %d at 0x%X.\n", -	       m->apicid, m->apicver, m->apicaddr); - -	mp_register_ioapic(m->apicid, m->apicaddr, gsi_top); -} - -static void print_MP_intsrc_info(struct mpc_intsrc *m) -{ -	apic_printk(APIC_VERBOSE, "Int: type %d, pol %d, trig %d, bus %02x," -		" IRQ %02x, APIC ID %x, APIC INT %02x\n", -		m->irqtype, m->irqflag & 3, (m->irqflag >> 2) & 3, m->srcbus, -		m->srcbusirq, m->dstapic, m->dstirq); +	if (m->flags & MPC_APIC_USABLE) +		mp_register_ioapic(m->apicid, m->apicaddr, gsi_top);  }  static void __init print_mp_irq_info(struct mpc_intsrc *mp_irq) @@ -144,73 +128,11 @@ static void __init print_mp_irq_info(struct mpc_intsrc *mp_irq)  		mp_irq->srcbusirq, mp_irq->dstapic, mp_irq->dstirq);  } -static void __init assign_to_mp_irq(struct mpc_intsrc *m, -				    struct mpc_intsrc *mp_irq) -{ -	mp_irq->dstapic = m->dstapic; -	mp_irq->type = m->type; -	mp_irq->irqtype = m->irqtype; -	mp_irq->irqflag = m->irqflag; -	mp_irq->srcbus = m->srcbus; -	mp_irq->srcbusirq = m->srcbusirq; -	mp_irq->dstirq = m->dstirq; -} - -static void __init assign_to_mpc_intsrc(struct mpc_intsrc *mp_irq, -					struct mpc_intsrc *m) -{ -	m->dstapic = mp_irq->dstapic; -	m->type = mp_irq->type; -	m->irqtype = mp_irq->irqtype; -	m->irqflag = mp_irq->irqflag; -	m->srcbus = mp_irq->srcbus; -	m->srcbusirq = mp_irq->srcbusirq; -	m->dstirq = mp_irq->dstirq; -} - -static int __init mp_irq_mpc_intsrc_cmp(struct mpc_intsrc *mp_irq, -					struct mpc_intsrc *m) -{ -	if (mp_irq->dstapic != m->dstapic) -		return 1; -	if (mp_irq->type != m->type) -		return 2; -	if (mp_irq->irqtype != m->irqtype) -		return 3; -	if (mp_irq->irqflag != m->irqflag) -		return 4; -	if (mp_irq->srcbus != m->srcbus) -		return 5; -	if (mp_irq->srcbusirq != m->srcbusirq) -		return 6; -	if (mp_irq->dstirq != m->dstirq) -		return 7; - -	return 0; -} - -static void __init MP_intsrc_info(struct mpc_intsrc *m) -{ -	int i; - -	print_MP_intsrc_info(m); - -	for (i = 0; i < mp_irq_entries; i++) { -		if (!mp_irq_mpc_intsrc_cmp(&mp_irqs[i], m)) -			return; -	} - -	assign_to_mp_irq(m, &mp_irqs[mp_irq_entries]); -	if (++mp_irq_entries == MAX_IRQ_SOURCES) -		panic("Max # of irq sources exceeded!!\n"); -}  #else /* CONFIG_X86_IO_APIC */  static inline void __init MP_bus_info(struct mpc_bus *m) {}  static inline void __init MP_ioapic_info(struct mpc_ioapic *m) {} -static inline void __init MP_intsrc_info(struct mpc_intsrc *m) {}  #endif /* CONFIG_X86_IO_APIC */ -  static void __init MP_lintsrc_info(struct mpc_lintsrc *m)  {  	apic_printk(APIC_VERBOSE, "Lint: type %d, pol %d, trig %d, bus %02x," @@ -222,7 +144,6 @@ static void __init MP_lintsrc_info(struct mpc_lintsrc *m)  /*   * Read/parse the MPC   */ -  static int __init smp_check_mpc(struct mpc_table *mpc, char *oem, char *str)  { @@ -275,18 +196,6 @@ static void __init smp_dump_mptable(struct mpc_table *mpc, unsigned char *mpt)  void __init default_smp_read_mpc_oem(struct mpc_table *mpc) { } -static void __init smp_register_lapic_address(unsigned long address) -{ -	mp_lapic_addr = address; - -	set_fixmap_nocache(FIX_APIC_BASE, address); -	if (boot_cpu_physical_apicid == -1U) { -		boot_cpu_physical_apicid  = read_apic_id(); -		apic_version[boot_cpu_physical_apicid] = -			 GET_APIC_VERSION(apic_read(APIC_LVR)); -	} -} -  static int __init smp_read_mpc(struct mpc_table *mpc, unsigned early)  {  	char str[16]; @@ -301,17 +210,13 @@ static int __init smp_read_mpc(struct mpc_table *mpc, unsigned early)  #ifdef CONFIG_X86_32  	generic_mps_oem_check(mpc, oem, str);  #endif -	/* save the local APIC address, it might be non-default */ +	/* Initialize the lapic mapping */  	if (!acpi_lapic) -		mp_lapic_addr = mpc->lapic; +		register_lapic_address(mpc->lapic);  	if (early)  		return 1; -	/* Initialize the lapic mapping */ -	if (!acpi_lapic) -		smp_register_lapic_address(mpc->lapic); -  	if (mpc->oemptr)  		x86_init.mpparse.smp_read_mpc_oem(mpc); @@ -337,7 +242,7 @@ static int __init smp_read_mpc(struct mpc_table *mpc, unsigned early)  			skip_entry(&mpt, &count, sizeof(struct mpc_ioapic));  			break;  		case MP_INTSRC: -			MP_intsrc_info((struct mpc_intsrc *)mpt); +			mp_save_irq((struct mpc_intsrc *)mpt);  			skip_entry(&mpt, &count, sizeof(struct mpc_intsrc));  			break;  		case MP_LINTSRC: @@ -377,7 +282,7 @@ static void __init construct_default_ioirq_mptable(int mpc_default_type)  	intsrc.type = MP_INTSRC;  	intsrc.irqflag = 0;	/* conforming */  	intsrc.srcbus = 0; -	intsrc.dstapic = mp_ioapics[0].apicid; +	intsrc.dstapic = mpc_ioapic_id(0);  	intsrc.irqtype = mp_INT; @@ -429,13 +334,13 @@ static void __init construct_default_ioirq_mptable(int mpc_default_type)  		intsrc.srcbusirq = i;  		intsrc.dstirq = i ? i : 2;	/* IRQ0 to INTIN2 */ -		MP_intsrc_info(&intsrc); +		mp_save_irq(&intsrc);  	}  	intsrc.irqtype = mp_ExtINT;  	intsrc.srcbusirq = 0;  	intsrc.dstirq = 0;	/* 8259A to INTIN0 */ -	MP_intsrc_info(&intsrc); +	mp_save_irq(&intsrc);  } @@ -460,9 +365,6 @@ static void __init construct_ioapic_table(int mpc_default_type)  	case 3:  		memcpy(bus.bustype, "EISA  ", 6);  		break; -	case 4: -	case 7: -		memcpy(bus.bustype, "MCA   ", 6);  	}  	MP_bus_info(&bus);  	if (mpc_default_type > 4) { @@ -656,9 +558,7 @@ void __init default_get_smp_config(unsigned int early)  static void __init smp_reserve_memory(struct mpf_intel *mpf)  { -	unsigned long size = get_mpc_size(mpf->physptr); - -	memblock_x86_reserve_range(mpf->physptr, mpf->physptr+size, "* MP-table mpc"); +	memblock_reserve(mpf->physptr, get_mpc_size(mpf->physptr));  }  static int __init smp_scan_config(unsigned long base, unsigned long length) @@ -667,8 +567,8 @@ static int __init smp_scan_config(unsigned long base, unsigned long length)  	struct mpf_intel *mpf;  	unsigned long mem; -	apic_printk(APIC_VERBOSE, "Scan SMP from %p for %ld bytes.\n", -			bp, length); +	apic_printk(APIC_VERBOSE, "Scan for SMP in [mem %#010lx-%#010lx]\n", +		    base, base + length - 1);  	BUILD_BUG_ON(sizeof(*mpf) != 16);  	while (length > 0) { @@ -683,11 +583,13 @@ static int __init smp_scan_config(unsigned long base, unsigned long length)  #endif  			mpf_found = mpf; -			printk(KERN_INFO "found SMP MP-table at [%p] %llx\n", -			       mpf, (u64)virt_to_phys(mpf)); +			printk(KERN_INFO "found SMP MP-table at [mem %#010llx-%#010llx] mapped at [%p]\n", +			       (unsigned long long) virt_to_phys(mpf), +			       (unsigned long long) virt_to_phys(mpf) + +			       sizeof(*mpf) - 1, mpf);  			mem = virt_to_phys(mpf); -			memblock_x86_reserve_range(mem, mem + sizeof(*mpf), "* MP-table mpf"); +			memblock_reserve(mem, sizeof(*mpf));  			if (mpf->physptr)  				smp_reserve_memory(mpf); @@ -717,7 +619,7 @@ void __init default_find_smp_config(void)  		return;  	/*  	 * If it is an SMP machine we should know now, unless the -	 * configuration is in an EISA/MCA bus machine with an +	 * configuration is in an EISA bus machine with an  	 * extended bios data area.  	 *  	 * there is a real-mode segmented pointer pointing to the @@ -784,11 +686,11 @@ static void __init check_irq_src(struct mpc_intsrc *m, int *nr_m_spare)  	int i;  	apic_printk(APIC_VERBOSE, "OLD "); -	print_MP_intsrc_info(m); +	print_mp_irq_info(m);  	i = get_MP_intsrc_index(m);  	if (i > 0) { -		assign_to_mpc_intsrc(&mp_irqs[i], m); +		memcpy(m, &mp_irqs[i], sizeof(*m));  		apic_printk(APIC_VERBOSE, "NEW ");  		print_mp_irq_info(&mp_irqs[i]);  		return; @@ -806,23 +708,21 @@ static void __init check_irq_src(struct mpc_intsrc *m, int *nr_m_spare)  		*nr_m_spare += 1;  	}  } -#else /* CONFIG_X86_IO_APIC */ -static -inline void __init check_irq_src(struct mpc_intsrc *m, int *nr_m_spare) {} -#endif /* CONFIG_X86_IO_APIC */ -static int +static int __init  check_slot(unsigned long mpc_new_phys, unsigned long mpc_new_length, int count)  { -	int ret = 0; -  	if (!mpc_new_phys || count <= mpc_new_length) {  		WARN(1, "update_mptable: No spare slots (length: %x)\n", count);  		return -1;  	} -	return ret; +	return 0;  } +#else /* CONFIG_X86_IO_APIC */ +static +inline void __init check_irq_src(struct mpc_intsrc *m, int *nr_m_spare) {} +#endif /* CONFIG_X86_IO_APIC */  static int  __init replace_intsrc_all(struct mpc_table *mpc,  					unsigned long mpc_new_phys, @@ -875,14 +775,14 @@ static int  __init replace_intsrc_all(struct mpc_table *mpc,  		if (nr_m_spare > 0) {  			apic_printk(APIC_VERBOSE, "*NEW* found\n");  			nr_m_spare--; -			assign_to_mpc_intsrc(&mp_irqs[i], m_spare[nr_m_spare]); +			memcpy(m_spare[nr_m_spare], &mp_irqs[i], sizeof(mp_irqs[i]));  			m_spare[nr_m_spare] = NULL;  		} else {  			struct mpc_intsrc *m = (struct mpc_intsrc *)mpt;  			count += sizeof(struct mpc_intsrc);  			if (check_slot(mpc_new_phys, mpc_new_length, count) < 0)  				goto out; -			assign_to_mpc_intsrc(&mp_irqs[i], m); +			memcpy(m, &mp_irqs[i], sizeof(*m));  			mpc->length = count;  			mpt += sizeof(struct mpc_intsrc);  		} @@ -930,10 +830,8 @@ early_param("alloc_mptable", parse_alloc_mptable_opt);  void __init early_reserve_e820_mpc_new(void)  { -	if (enable_update_mptable && alloc_mptable) { -		u64 startt = 0; -		mpc_new_phys = early_reserve_e820(startt, mpc_new_length, 4); -	} +	if (enable_update_mptable && alloc_mptable) +		mpc_new_phys = early_reserve_e820(mpc_new_length, 4);  }  static int __init update_mp_table(void) @@ -975,7 +873,7 @@ static int __init update_mp_table(void)  	if (!mpc_new_phys) {  		unsigned char old, new; -		/* check if we can change the postion */ +		/* check if we can change the position */  		mpc->checksum = 0;  		old = mpf_checksum((unsigned char *)mpc, mpc->length);  		mpc->checksum = 0xff; @@ -984,7 +882,7 @@ static int __init update_mp_table(void)  			printk(KERN_INFO "mpc is readonly, please try alloc_mptable instead\n");  			return 0;  		} -		printk(KERN_INFO "use in-positon replacing\n"); +		printk(KERN_INFO "use in-position replacing\n");  	} else {  		mpf->physptr = mpc_new_phys;  		mpc_new = phys_to_virt(mpc_new_phys);  | 
