setup.c 30.3 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
/*
 *  Copyright (C) 1995  Linus Torvalds
 *
 *  Support of BIGMEM added by Gerhard Wichert, Siemens AG, July 1999
 *
 *  Memory region support
 *	David Parsons <orc@pell.chi.il.us>, July-August 1999
 *
 *  Added E820 sanitization routine (removes overlapping memory regions);
 *  Brian Moyle <bmoyle@mvista.com>, February 2001
 *
 * Moved CPU detection code to cpu/${cpu}.c
 *    Patrick Mochel <mochel@osdl.org>, March 2002
 *
 *  Provisions for empty E820 memory regions (reported by certain BIOSes).
 *  Alex Achenbach <xela@slit.de>, December 2002.
 *
 */

/*
 * This file handles the architecture-dependent parts of initialization
 */

#include <linux/sched.h>
#include <linux/mm.h>
26
#include <linux/mmzone.h>
27
#include <linux/screen_info.h>
L
Linus Torvalds 已提交
28 29
#include <linux/ioport.h>
#include <linux/acpi.h>
F
Feng Tang 已提交
30
#include <linux/sfi.h>
L
Linus Torvalds 已提交
31 32 33
#include <linux/apm_bios.h>
#include <linux/initrd.h>
#include <linux/bootmem.h>
34
#include <linux/memblock.h>
L
Linus Torvalds 已提交
35 36 37 38 39 40 41 42
#include <linux/seq_file.h>
#include <linux/console.h>
#include <linux/root_dev.h>
#include <linux/highmem.h>
#include <linux/module.h>
#include <linux/efi.h>
#include <linux/init.h>
#include <linux/edd.h>
43
#include <linux/iscsi_ibft.h>
L
Linus Torvalds 已提交
44
#include <linux/nodemask.h>
45
#include <linux/kexec.h>
46
#include <linux/dmi.h>
D
Dave Hansen 已提交
47
#include <linux/pfn.h>
48
#include <linux/pci.h>
49
#include <asm/pci-direct.h>
50
#include <linux/init_ohci1394_dma.h>
51
#include <linux/kvm_para.h>
52
#include <linux/dma-contiguous.h>
53

54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
#include <linux/errno.h>
#include <linux/kernel.h>
#include <linux/stddef.h>
#include <linux/unistd.h>
#include <linux/ptrace.h>
#include <linux/user.h>
#include <linux/delay.h>

#include <linux/kallsyms.h>
#include <linux/cpufreq.h>
#include <linux/dma-mapping.h>
#include <linux/ctype.h>
#include <linux/uaccess.h>

#include <linux/percpu.h>
#include <linux/crash_dump.h>
70
#include <linux/tboot.h>
71
#include <linux/jiffies.h>
72

L
Linus Torvalds 已提交
73
#include <video/edid.h>
74

75
#include <asm/mtrr.h>
76
#include <asm/apic.h>
77
#include <asm/realmode.h>
L
Linus Torvalds 已提交
78 79 80
#include <asm/e820.h>
#include <asm/mpspec.h>
#include <asm/setup.h>
Y
Yinghai Lu 已提交
81
#include <asm/efi.h>
I
Ingo Molnar 已提交
82 83
#include <asm/timer.h>
#include <asm/i8259.h>
L
Linus Torvalds 已提交
84 85 86
#include <asm/sections.h>
#include <asm/io_apic.h>
#include <asm/ist.h>
87
#include <asm/setup_arch.h>
88
#include <asm/bios_ebda.h>
B
Bernhard Walle 已提交
89
#include <asm/cacheflush.h>
90
#include <asm/processor.h>
Y
Yinghai Lu 已提交
91
#include <asm/bugs.h>
L
Linus Torvalds 已提交
92

93
#include <asm/vsyscall.h>
94
#include <asm/cpu.h>
95 96
#include <asm/desc.h>
#include <asm/dma.h>
97
#include <asm/iommu.h>
98
#include <asm/gart.h>
99 100 101 102
#include <asm/mmu_context.h>
#include <asm/proto.h>

#include <asm/paravirt.h>
103
#include <asm/hypervisor.h>
104
#include <asm/olpc_ofw.h>
105 106 107 108

#include <asm/percpu.h>
#include <asm/topology.h>
#include <asm/apicdef.h>
109
#include <asm/amd_nb.h>
110
#include <asm/mce.h>
111
#include <asm/alternative.h>
112
#include <asm/prom.h>
113

114
/*
115 116 117 118 119
 * max_low_pfn_mapped: highest direct mapped pfn under 4GB
 * max_pfn_mapped:     highest direct mapped pfn over 4GB
 *
 * The direct mapping only covers E820_RAM regions, so the ranges and gaps are
 * represented by pfn_mapped
120 121 122 123
 */
unsigned long max_low_pfn_mapped;
unsigned long max_pfn_mapped;

124
#ifdef CONFIG_DMI
125
RESERVE_BRK(dmi_alloc, 65536);
126
#endif
127

I
Ingo Molnar 已提交
128

129 130 131
static __initdata unsigned long _brk_start = (unsigned long)__brk_base;
unsigned long _brk_end = (unsigned long)__brk_base;

I
Ingo Molnar 已提交
132 133 134 135 136 137
#ifdef CONFIG_X86_64
int default_cpu_present_to_apicid(int mps_cpu)
{
	return __default_cpu_present_to_apicid(mps_cpu);
}

T
Thomas Gleixner 已提交
138
int default_check_phys_apicid_present(int phys_apicid)
I
Ingo Molnar 已提交
139
{
T
Thomas Gleixner 已提交
140
	return __default_check_phys_apicid_present(phys_apicid);
I
Ingo Molnar 已提交
141 142 143
}
#endif

144 145
struct boot_params boot_params;

L
Linus Torvalds 已提交
146 147 148
/*
 * Machine setup..
 */
149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169
static struct resource data_resource = {
	.name	= "Kernel data",
	.start	= 0,
	.end	= 0,
	.flags	= IORESOURCE_BUSY | IORESOURCE_MEM
};

static struct resource code_resource = {
	.name	= "Kernel code",
	.start	= 0,
	.end	= 0,
	.flags	= IORESOURCE_BUSY | IORESOURCE_MEM
};

static struct resource bss_resource = {
	.name	= "Kernel bss",
	.start	= 0,
	.end	= 0,
	.flags	= IORESOURCE_BUSY | IORESOURCE_MEM
};

170 171

#ifdef CONFIG_X86_32
L
Linus Torvalds 已提交
172
/* cpu data as detected by the assembly code in head.S */
173
struct cpuinfo_x86 new_cpu_data = {
174 175
	.wp_works_ok = -1,
};
L
Linus Torvalds 已提交
176
/* common cpu data for all cpus */
177 178 179
struct cpuinfo_x86 boot_cpu_data __read_mostly = {
	.wp_works_ok = -1,
};
180
EXPORT_SYMBOL(boot_cpu_data);
L
Linus Torvalds 已提交
181

182 183
unsigned int def_to_bigsmp;

L
Linus Torvalds 已提交
184 185 186 187 188
/* for MCA, but anyone else can use it if they want */
unsigned int machine_id;
unsigned int machine_submodel_id;
unsigned int BIOS_revision;

189 190 191 192 193 194 195 196 197 198 199 200
struct apm_info apm_info;
EXPORT_SYMBOL(apm_info);

#if defined(CONFIG_X86_SPEEDSTEP_SMI) || \
	defined(CONFIG_X86_SPEEDSTEP_SMI_MODULE)
struct ist_info ist_info;
EXPORT_SYMBOL(ist_info);
#else
struct ist_info ist_info;
#endif

#else
201 202 203
struct cpuinfo_x86 boot_cpu_data __read_mostly = {
	.x86_phys_bits = MAX_PHYSMEM_BITS,
};
204 205 206 207 208
EXPORT_SYMBOL(boot_cpu_data);
#endif


#if !defined(CONFIG_X86_PAE) || defined(CONFIG_X86_64)
209
__visible unsigned long mmu_cr4_features;
210
#else
211
__visible unsigned long mmu_cr4_features = X86_CR4_PAE;
212 213
#endif

214 215
/* Boot loader ID and version as integers, for the benefit of proc_dointvec */
int bootloader_type, bootloader_version;
L
Linus Torvalds 已提交
216 217 218 219 220

/*
 * Setup options
 */
struct screen_info screen_info;
221
EXPORT_SYMBOL(screen_info);
L
Linus Torvalds 已提交
222
struct edid_info edid_info;
223
EXPORT_SYMBOL_GPL(edid_info);
L
Linus Torvalds 已提交
224 225 226

extern int root_mountflags;

227
unsigned long saved_video_mode;
L
Linus Torvalds 已提交
228

229
#define RAMDISK_IMAGE_START_MASK	0x07FF
L
Linus Torvalds 已提交
230
#define RAMDISK_PROMPT_FLAG		0x8000
231
#define RAMDISK_LOAD_FLAG		0x4000
L
Linus Torvalds 已提交
232

233
static char __initdata command_line[COMMAND_LINE_SIZE];
234 235 236
#ifdef CONFIG_CMDLINE_BOOL
static char __initdata builtin_cmdline[COMMAND_LINE_SIZE] = CONFIG_CMDLINE;
#endif
L
Linus Torvalds 已提交
237 238 239 240 241 242 243 244 245 246 247

#if defined(CONFIG_EDD) || defined(CONFIG_EDD_MODULE)
struct edd edd;
#ifdef CONFIG_EDD_MODULE
EXPORT_SYMBOL(edd);
#endif
/**
 * copy_edd() - Copy the BIOS EDD information
 *              from boot_params into a safe place.
 *
 */
248
static inline void __init copy_edd(void)
L
Linus Torvalds 已提交
249
{
250 251 252 253 254
     memcpy(edd.mbr_signature, boot_params.edd_mbr_sig_buffer,
	    sizeof(edd.mbr_signature));
     memcpy(edd.edd_info, boot_params.eddbuf, sizeof(edd.edd_info));
     edd.mbr_signature_nr = boot_params.edd_mbr_sig_buf_entries;
     edd.edd_info_nr = boot_params.eddbuf_entries;
L
Linus Torvalds 已提交
255 256
}
#else
257
static inline void __init copy_edd(void)
L
Linus Torvalds 已提交
258 259 260 261
{
}
#endif

262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280
void * __init extend_brk(size_t size, size_t align)
{
	size_t mask = align - 1;
	void *ret;

	BUG_ON(_brk_start == 0);
	BUG_ON(align & mask);

	_brk_end = (_brk_end + mask) & ~mask;
	BUG_ON((char *)(_brk_end + size) > __brk_limit);

	ret = (void *)_brk_end;
	_brk_end += size;

	memset(ret, 0, size);

	return ret;
}

281
#ifdef CONFIG_X86_32
282
static void __init cleanup_highmap(void)
283 284
{
}
285 286
#endif

287 288 289
static void __init reserve_brk(void)
{
	if (_brk_end > _brk_start)
290 291
		memblock_reserve(__pa_symbol(_brk_start),
				 _brk_end - _brk_start);
292 293 294 295 296 297

	/* Mark brk area as locked down and no longer taking any
	   new allocations */
	_brk_start = 0;
}

298 299
#ifdef CONFIG_BLK_DEV_INITRD

Y
Yinghai Lu 已提交
300 301 302 303
static u64 __init get_ramdisk_image(void)
{
	u64 ramdisk_image = boot_params.hdr.ramdisk_image;

304 305
	ramdisk_image |= (u64)boot_params.ext_ramdisk_image << 32;

Y
Yinghai Lu 已提交
306 307 308 309 310 311
	return ramdisk_image;
}
static u64 __init get_ramdisk_size(void)
{
	u64 ramdisk_size = boot_params.hdr.ramdisk_size;

312 313
	ramdisk_size |= (u64)boot_params.ext_ramdisk_size << 32;

Y
Yinghai Lu 已提交
314 315 316
	return ramdisk_size;
}

317 318
#define MAX_MAP_CHUNK	(NR_FIX_BTMAPS << PAGE_SHIFT)
static void __init relocate_initrd(void)
319
{
320
	/* Assume only end is not page aligned */
Y
Yinghai Lu 已提交
321 322
	u64 ramdisk_image = get_ramdisk_image();
	u64 ramdisk_size  = get_ramdisk_size();
323
	u64 area_size     = PAGE_ALIGN(ramdisk_size);
324
	u64 ramdisk_here;
325 326
	unsigned long slop, clen, mapaddr;
	char *p, *q;
327

328
	/* We need to move the initrd down into directly mapped mem */
329
	ramdisk_here = memblock_find_in_range(0, PFN_PHYS(max_pfn_mapped),
330
						 area_size, PAGE_SIZE);
331

T
Tejun Heo 已提交
332
	if (!ramdisk_here)
333 334 335
		panic("Cannot find place for new RAMDISK of size %lld\n",
			 ramdisk_size);

336
	/* Note: this includes all the mem currently occupied by
337
	   the initrd, we rely on that fact to keep the data intact. */
338
	memblock_reserve(ramdisk_here, area_size);
339 340
	initrd_start = ramdisk_here + PAGE_OFFSET;
	initrd_end   = initrd_start + ramdisk_size;
341 342
	printk(KERN_INFO "Allocated new RAMDISK: [mem %#010llx-%#010llx]\n",
			 ramdisk_here, ramdisk_here + ramdisk_size - 1);
343 344 345

	q = (char *)initrd_start;

346
	/* Copy the initrd */
347 348 349 350 351 352
	while (ramdisk_size) {
		slop = ramdisk_image & ~PAGE_MASK;
		clen = ramdisk_size;
		if (clen > MAX_MAP_CHUNK-slop)
			clen = MAX_MAP_CHUNK-slop;
		mapaddr = ramdisk_image & PAGE_MASK;
353
		p = early_memremap(mapaddr, clen+slop);
354
		memcpy(q, p+slop, clen);
355
		early_iounmap(p, clen+slop);
356 357 358 359
		q += clen;
		ramdisk_image += clen;
		ramdisk_size  -= clen;
	}
360

Y
Yinghai Lu 已提交
361 362
	ramdisk_image = get_ramdisk_image();
	ramdisk_size  = get_ramdisk_size();
363 364
	printk(KERN_INFO "Move RAMDISK from [mem %#010llx-%#010llx] to"
		" [mem %#010llx-%#010llx]\n",
365 366
		ramdisk_image, ramdisk_image + ramdisk_size - 1,
		ramdisk_here, ramdisk_here + ramdisk_size - 1);
367
}
Y
Yinghai Lu 已提交
368

369 370 371
static void __init early_reserve_initrd(void)
{
	/* Assume only end is not page aligned */
Y
Yinghai Lu 已提交
372 373
	u64 ramdisk_image = get_ramdisk_image();
	u64 ramdisk_size  = get_ramdisk_size();
374 375 376 377 378 379 380 381
	u64 ramdisk_end   = PAGE_ALIGN(ramdisk_image + ramdisk_size);

	if (!boot_params.hdr.type_of_loader ||
	    !ramdisk_image || !ramdisk_size)
		return;		/* No initrd provided by bootloader */

	memblock_reserve(ramdisk_image, ramdisk_end - ramdisk_image);
}
382 383
static void __init reserve_initrd(void)
{
384
	/* Assume only end is not page aligned */
Y
Yinghai Lu 已提交
385 386
	u64 ramdisk_image = get_ramdisk_image();
	u64 ramdisk_size  = get_ramdisk_size();
387
	u64 ramdisk_end   = PAGE_ALIGN(ramdisk_image + ramdisk_size);
388
	u64 mapped_size;
389 390 391 392 393 394 395

	if (!boot_params.hdr.type_of_loader ||
	    !ramdisk_image || !ramdisk_size)
		return;		/* No initrd provided by bootloader */

	initrd_start = 0;

Y
Yinghai Lu 已提交
396
	mapped_size = memblock_mem_size(max_pfn_mapped);
397
	if (ramdisk_size >= (mapped_size>>1))
398 399
		panic("initrd too large to handle, "
		       "disabling initrd (%lld needed, %lld available)\n",
400
		       ramdisk_size, mapped_size>>1);
401

402 403
	printk(KERN_INFO "RAMDISK: [mem %#010llx-%#010llx]\n", ramdisk_image,
			ramdisk_end - 1);
404

405
	if (pfn_range_is_mapped(PFN_DOWN(ramdisk_image),
406 407
				PFN_DOWN(ramdisk_end))) {
		/* All are mapped, easy case */
408 409 410 411 412 413
		initrd_start = ramdisk_image + PAGE_OFFSET;
		initrd_end = initrd_start + ramdisk_size;
		return;
	}

	relocate_initrd();
414

415
	memblock_free(ramdisk_image, ramdisk_end - ramdisk_image);
416
}
Y
Yinghai Lu 已提交
417
#else
418 419 420
static void __init early_reserve_initrd(void)
{
}
421
static void __init reserve_initrd(void)
Y
Yinghai Lu 已提交
422 423
{
}
424 425
#endif /* CONFIG_BLK_DEV_INITRD */

426
static void __init parse_setup_data(void)
427 428
{
	struct setup_data *data;
429
	u64 pa_data, pa_next;
430 431 432

	pa_data = boot_params.hdr.setup_data;
	while (pa_data) {
433
		u32 data_len, map_len, data_type;
434 435 436 437 438

		map_len = max(PAGE_SIZE - (pa_data & ~PAGE_MASK),
			      (u64)sizeof(struct setup_data));
		data = early_memremap(pa_data, map_len);
		data_len = data->len + sizeof(struct setup_data);
439 440 441
		data_type = data->type;
		pa_next = data->next;
		early_iounmap(data, map_len);
442

443
		switch (data_type) {
444
		case SETUP_E820_EXT:
445
			parse_e820_ext(pa_data, data_len);
446
			break;
447 448
		case SETUP_DTB:
			add_dtb(pa_data);
449 450 451 452
			break;
		default:
			break;
		}
453
		pa_data = pa_next;
454 455 456
	}
}

457
static void __init e820_reserve_setup_data(void)
458 459 460
{
	struct setup_data *data;
	u64 pa_data;
461
	int found = 0;
462 463 464

	pa_data = boot_params.hdr.setup_data;
	while (pa_data) {
465
		data = early_memremap(pa_data, sizeof(*data));
466 467
		e820_update_range(pa_data, sizeof(*data)+data->len,
			 E820_RAM, E820_RESERVED_KERN);
468
		found = 1;
469 470 471
		pa_data = data->next;
		early_iounmap(data, sizeof(*data));
	}
472 473 474
	if (!found)
		return;

475
	sanitize_e820_map(e820.map, ARRAY_SIZE(e820.map), &e820.nr_map);
476
	memcpy(&e820_saved, &e820, sizeof(struct e820map));
477 478 479 480
	printk(KERN_INFO "extended physical RAM map:\n");
	e820_print_map("reserve setup_data");
}

481
static void __init memblock_x86_reserve_range_setup_data(void)
482 483 484 485 486 487
{
	struct setup_data *data;
	u64 pa_data;

	pa_data = boot_params.hdr.setup_data;
	while (pa_data) {
488
		data = early_memremap(pa_data, sizeof(*data));
489
		memblock_reserve(pa_data, sizeof(*data) + data->len);
490 491 492 493 494
		pa_data = data->next;
		early_iounmap(data, sizeof(*data));
	}
}

495 496 497 498 499
/*
 * --------- Crashkernel reservation ------------------------------
 */

#ifdef CONFIG_KEXEC
500

501 502 503
/*
 * Keep the crash kernel below this limit.  On 32 bits earlier kernels
 * would limit the kernel to the low 512 MiB due to mapping restrictions.
504
 * On 64bit, old kexec-tools need to under 896MiB.
505 506
 */
#ifdef CONFIG_X86_32
507 508
# define CRASH_KERNEL_ADDR_LOW_MAX	(512 << 20)
# define CRASH_KERNEL_ADDR_HIGH_MAX	(512 << 20)
509
#else
510 511
# define CRASH_KERNEL_ADDR_LOW_MAX	(896UL<<20)
# define CRASH_KERNEL_ADDR_HIGH_MAX	MAXMEM
512 513
#endif

514 515 516 517 518 519 520
static void __init reserve_crashkernel_low(void)
{
#ifdef CONFIG_X86_64
	const unsigned long long alignment = 16<<20;	/* 16M */
	unsigned long long low_base = 0, low_size = 0;
	unsigned long total_low_mem;
	unsigned long long base;
521
	bool auto_set = false;
522 523 524
	int ret;

	total_low_mem = memblock_mem_size(1UL<<(32-PAGE_SHIFT));
525
	/* crashkernel=Y,low */
526 527
	ret = parse_crashkernel_low(boot_command_line, total_low_mem,
						&low_size, &base);
528 529 530 531 532 533 534 535 536 537 538
	if (ret != 0) {
		/*
		 * two parts from lib/swiotlb.c:
		 *	swiotlb size: user specified with swiotlb= or default.
		 *	swiotlb overflow buffer: now is hardcoded to 32k.
		 *		We round it to 8M for other buffers that
		 *		may need to stay low too.
		 */
		low_size = swiotlb_size_or_default() + (8UL<<20);
		auto_set = true;
	} else {
539
		/* passed with crashkernel=0,low ? */
540 541 542
		if (!low_size)
			return;
	}
543 544 545 546 547

	low_base = memblock_find_in_range(low_size, (1ULL<<32),
					low_size, alignment);

	if (!low_base) {
548 549
		if (!auto_set)
			pr_info("crashkernel low reservation failed - No suitable area found.\n");
550 551 552 553 554 555 556 557 558 559 560 561

		return;
	}

	memblock_reserve(low_base, low_size);
	pr_info("Reserving %ldMB of low memory at %ldMB for crashkernel (System low RAM: %ldMB)\n",
			(unsigned long)(low_size >> 20),
			(unsigned long)(low_base >> 20),
			(unsigned long)(total_low_mem >> 20));
	crashk_low_res.start = low_base;
	crashk_low_res.end   = low_base + low_size - 1;
	insert_resource(&iomem_resource, &crashk_low_res);
562
#endif
563
}
564

565
static void __init reserve_crashkernel(void)
566
{
567
	const unsigned long long alignment = 16<<20;	/* 16M */
568 569
	unsigned long long total_mem;
	unsigned long long crash_size, crash_base;
570
	bool high = false;
571 572
	int ret;

573
	total_mem = memblock_phys_mem_size();
574

575
	/* crashkernel=XM */
576 577
	ret = parse_crashkernel(boot_command_line, total_mem,
			&crash_size, &crash_base);
578
	if (ret != 0 || crash_size <= 0) {
579
		/* crashkernel=X,high */
580 581 582 583 584 585
		ret = parse_crashkernel_high(boot_command_line, total_mem,
				&crash_size, &crash_base);
		if (ret != 0 || crash_size <= 0)
			return;
		high = true;
	}
586 587 588

	/* 0 means: find the address automatically */
	if (crash_base <= 0) {
589
		/*
590
		 *  kexec want bzImage is below CRASH_KERNEL_ADDR_MAX
591 592
		 */
		crash_base = memblock_find_in_range(alignment,
593 594 595
					high ? CRASH_KERNEL_ADDR_HIGH_MAX :
					       CRASH_KERNEL_ADDR_LOW_MAX,
					crash_size, alignment);
596

T
Tejun Heo 已提交
597
		if (!crash_base) {
598
			pr_info("crashkernel reservation failed - No suitable area found.\n");
599 600
			return;
		}
601

602
	} else {
603 604
		unsigned long long start;

605 606
		start = memblock_find_in_range(crash_base,
				 crash_base + crash_size, crash_size, 1<<20);
607 608
		if (start != crash_base) {
			pr_info("crashkernel reservation failed - memory is in use.\n");
609 610
			return;
		}
611
	}
612
	memblock_reserve(crash_base, crash_size);
613

614 615 616 617 618
	printk(KERN_INFO "Reserving %ldMB of memory at %ldMB "
			"for crashkernel (System RAM: %ldMB)\n",
			(unsigned long)(crash_size >> 20),
			(unsigned long)(crash_base >> 20),
			(unsigned long)(total_mem >> 20));
619

620 621 622
	crashk_res.start = crash_base;
	crashk_res.end   = crash_base + crash_size - 1;
	insert_resource(&iomem_resource, &crashk_res);
623 624 625

	if (crash_base >= (1ULL<<32))
		reserve_crashkernel_low();
626 627
}
#else
628
static void __init reserve_crashkernel(void)
629 630 631 632
{
}
#endif

633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655
static struct resource standard_io_resources[] = {
	{ .name = "dma1", .start = 0x00, .end = 0x1f,
		.flags = IORESOURCE_BUSY | IORESOURCE_IO },
	{ .name = "pic1", .start = 0x20, .end = 0x21,
		.flags = IORESOURCE_BUSY | IORESOURCE_IO },
	{ .name = "timer0", .start = 0x40, .end = 0x43,
		.flags = IORESOURCE_BUSY | IORESOURCE_IO },
	{ .name = "timer1", .start = 0x50, .end = 0x53,
		.flags = IORESOURCE_BUSY | IORESOURCE_IO },
	{ .name = "keyboard", .start = 0x60, .end = 0x60,
		.flags = IORESOURCE_BUSY | IORESOURCE_IO },
	{ .name = "keyboard", .start = 0x64, .end = 0x64,
		.flags = IORESOURCE_BUSY | IORESOURCE_IO },
	{ .name = "dma page reg", .start = 0x80, .end = 0x8f,
		.flags = IORESOURCE_BUSY | IORESOURCE_IO },
	{ .name = "pic2", .start = 0xa0, .end = 0xa1,
		.flags = IORESOURCE_BUSY | IORESOURCE_IO },
	{ .name = "dma2", .start = 0xc0, .end = 0xdf,
		.flags = IORESOURCE_BUSY | IORESOURCE_IO },
	{ .name = "fpu", .start = 0xf0, .end = 0xff,
		.flags = IORESOURCE_BUSY | IORESOURCE_IO }
};

656
void __init reserve_standard_io_resources(void)
657 658 659 660 661 662 663 664 665
{
	int i;

	/* request I/O space for devices used on all i[345]86 PCs */
	for (i = 0; i < ARRAY_SIZE(standard_io_resources); i++)
		request_resource(&ioport_resource, &standard_io_resources[i]);

}

666 667 668 669 670 671 672
static __init void reserve_ibft_region(void)
{
	unsigned long addr, size = 0;

	addr = find_ibft_region(&size);

	if (size)
673
		memblock_reserve(addr, size);
674 675
}

676 677
static bool __init snb_gfx_workaround_needed(void)
{
678
#ifdef CONFIG_PCI
679 680
	int i;
	u16 vendor, devid;
681
	static const __initconst u16 snb_ids[] = {
682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702
		0x0102,
		0x0112,
		0x0122,
		0x0106,
		0x0116,
		0x0126,
		0x010a,
	};

	/* Assume no if something weird is going on with PCI */
	if (!early_pci_allowed())
		return false;

	vendor = read_pci_config_16(0, 2, 0, PCI_VENDOR_ID);
	if (vendor != 0x8086)
		return false;

	devid = read_pci_config_16(0, 2, 0, PCI_DEVICE_ID);
	for (i = 0; i < ARRAY_SIZE(snb_ids); i++)
		if (devid == snb_ids[i])
			return true;
703
#endif
704 705 706 707 708 709 710 711 712 713

	return false;
}

/*
 * Sandy Bridge graphics has trouble with certain ranges, exclude
 * them from allocation.
 */
static void __init trim_snb_memory(void)
{
714
	static const __initconst unsigned long bad_pages[] = {
715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752
		0x20050000,
		0x20110000,
		0x20130000,
		0x20138000,
		0x40004000,
	};
	int i;

	if (!snb_gfx_workaround_needed())
		return;

	printk(KERN_DEBUG "reserving inaccessible SNB gfx pages\n");

	/*
	 * Reserve all memory below the 1 MB mark that has not
	 * already been reserved.
	 */
	memblock_reserve(0, 1<<20);
	
	for (i = 0; i < ARRAY_SIZE(bad_pages); i++) {
		if (memblock_reserve(bad_pages[i], PAGE_SIZE))
			printk(KERN_WARNING "failed to reserve 0x%08lx\n",
			       bad_pages[i]);
	}
}

/*
 * Here we put platform-specific memory range workarounds, i.e.
 * memory known to be corrupt or otherwise in need to be reserved on
 * specific platforms.
 *
 * If this gets used more widely it could use a real dispatch mechanism.
 */
static void __init trim_platform_memory_ranges(void)
{
	trim_snb_memory();
}

753 754 755 756 757 758
static void __init trim_bios_range(void)
{
	/*
	 * A special case is the first 4Kb of memory;
	 * This is a BIOS owned area, not kernel ram, but generally
	 * not listed as such in the E820 table.
759 760 761
	 *
	 * This typically reserves additional memory (64KiB by default)
	 * since some BIOSes are known to corrupt low memory.  See the
762
	 * Kconfig help text for X86_RESERVE_LOW.
763
	 */
764
	e820_update_range(0, PAGE_SIZE, E820_RAM, E820_RESERVED);
765

766 767 768 769 770 771
	/*
	 * special case: Some BIOSen report the PC BIOS
	 * area (640->1Mb) as ram even though it is not.
	 * take them out.
	 */
	e820_remove_range(BIOS_BEGIN, BIOS_END - BIOS_BEGIN, E820_RAM, 1);
772

773 774 775
	sanitize_e820_map(e820.map, ARRAY_SIZE(e820.map), &e820.nr_map);
}

776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796
/* called before trim_bios_range() to spare extra sanitize */
static void __init e820_add_kernel_range(void)
{
	u64 start = __pa_symbol(_text);
	u64 size = __pa_symbol(_end) - start;

	/*
	 * Complain if .text .data and .bss are not marked as E820_RAM and
	 * attempt to fix it by adding the range. We may have a confused BIOS,
	 * or the user may have used memmap=exactmap or memmap=xxM$yyM to
	 * exclude kernel range. If we really are running on top non-RAM,
	 * we will crash later anyways.
	 */
	if (e820_all_mapped(start, start + size, E820_RAM))
		return;

	pr_warn(".text .data .bss are not marked as E820_RAM!\n");
	e820_remove_range(start, size, E820_RAM, 0);
	e820_add_region(start, size, E820_RAM);
}

797 798
static unsigned reserve_low = CONFIG_X86_RESERVE_LOW << 10;

799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820
static int __init parse_reservelow(char *p)
{
	unsigned long long size;

	if (!p)
		return -EINVAL;

	size = memparse(p, &p);

	if (size < 4096)
		size = 4096;

	if (size > 640*1024)
		size = 640*1024;

	reserve_low = size;

	return 0;
}

early_param("reservelow", parse_reservelow);

821 822 823 824 825
static void __init trim_low_memory_range(void)
{
	memblock_reserve(0, ALIGN(reserve_low, PAGE_SIZE));
}
	
L
Linus Torvalds 已提交
826 827 828 829 830 831 832
/*
 * Determine if we were loaded by an EFI loader.  If so, then we have also been
 * passed the efi memmap, systab, etc., so we should use these data structures
 * for initialization.  Note, the efi init code path is determined by the
 * global efi_enabled. This allows the same kernel image to be used on existing
 * systems (with a traditional BIOS) as well as on EFI systems.
 */
833 834 835 836 837 838
/*
 * setup_arch - architecture-specific boot-time initializations
 *
 * Note: On x86_64, fixmaps are ready for use even before this is called.
 */

L
Linus Torvalds 已提交
839 840
void __init setup_arch(char **cmdline_p)
{
841 842 843
	memblock_reserve(__pa_symbol(_text),
			 (unsigned long)__bss_stop - (unsigned long)_text);

844 845
	early_reserve_initrd();

846 847 848 849 850 851
	/*
	 * At this point everything still needed from the boot loader
	 * or BIOS or kernel text should be early reserved or marked not
	 * RAM in e820. All other memory is free game.
	 */

852
#ifdef CONFIG_X86_32
L
Linus Torvalds 已提交
853
	memcpy(&boot_cpu_data, &new_cpu_data, sizeof(new_cpu_data));
I
Ingo Molnar 已提交
854
	visws_early_detect();
855 856 857 858 859 860 861 862 863 864 865

	/*
	 * copy kernel address range established so far and switch
	 * to the proper swapper page table
	 */
	clone_pgd_range(swapper_pg_dir     + KERNEL_PGD_BOUNDARY,
			initial_page_table + KERNEL_PGD_BOUNDARY,
			KERNEL_PGD_PTRS);

	load_cr3(swapper_pg_dir);
	__flush_tlb_all();
866 867 868
#else
	printk(KERN_INFO "Command line: %s\n", boot_command_line);
#endif
L
Linus Torvalds 已提交
869

870 871 872 873
	/*
	 * If we have OLPC OFW, we might end up relocating the fixmap due to
	 * reserve_top(), so do this before touching the ioremap area.
	 */
874 875
	olpc_ofw_detect();

876
	early_trap_init();
877
	early_cpu_init();
878 879
	early_ioremap_init();

880 881
	setup_olpc_ofw_pgd();

882 883 884
	ROOT_DEV = old_decode_dev(boot_params.hdr.root_dev);
	screen_info = boot_params.screen_info;
	edid_info = boot_params.edid_info;
885
#ifdef CONFIG_X86_32
886 887
	apm_info.bios = boot_params.apm_bios_info;
	ist_info = boot_params.ist_info;
888
	if (boot_params.sys_desc_table.length != 0) {
889 890 891
		machine_id = boot_params.sys_desc_table.table[0];
		machine_submodel_id = boot_params.sys_desc_table.table[1];
		BIOS_revision = boot_params.sys_desc_table.table[2];
L
Linus Torvalds 已提交
892
	}
893 894
#endif
	saved_video_mode = boot_params.hdr.vid_mode;
895
	bootloader_type = boot_params.hdr.type_of_loader;
896 897 898 899 900 901
	if ((bootloader_type >> 4) == 0xe) {
		bootloader_type &= 0xf;
		bootloader_type |= (boot_params.hdr.ext_loader_type+0x10) << 4;
	}
	bootloader_version  = bootloader_type & 0xf;
	bootloader_version |= boot_params.hdr.ext_loader_ver << 4;
L
Linus Torvalds 已提交
902 903

#ifdef CONFIG_BLK_DEV_RAM
904 905 906
	rd_image_start = boot_params.hdr.ram_size & RAMDISK_IMAGE_START_MASK;
	rd_prompt = ((boot_params.hdr.ram_size & RAMDISK_PROMPT_FLAG) != 0);
	rd_doload = ((boot_params.hdr.ram_size & RAMDISK_LOAD_FLAG) != 0);
L
Linus Torvalds 已提交
907
#endif
908 909
#ifdef CONFIG_EFI
	if (!strncmp((char *)&boot_params.efi_info.efi_loader_signature,
910
		     "EL32", 4)) {
911
		set_bit(EFI_BOOT, &x86_efi_facility);
912 913
	} else if (!strncmp((char *)&boot_params.efi_info.efi_loader_signature,
		     "EL64", 4)) {
914 915
		set_bit(EFI_BOOT, &x86_efi_facility);
		set_bit(EFI_64BIT, &x86_efi_facility);
916
	}
917 918 919

	if (efi_enabled(EFI_BOOT))
		efi_memblock_x86_reserve_range();
920 921
#endif

922
	x86_init.oem.arch_setup();
923

924
	iomem_resource.end = (1ULL << boot_cpu_data.x86_phys_bits) - 1;
925
	setup_memory_map();
926
	parse_setup_data();
927 928
	/* update the e820_saved too */
	e820_reserve_setup_data();
929

L
Linus Torvalds 已提交
930 931
	copy_edd();

932
	if (!boot_params.hdr.root_flags)
L
Linus Torvalds 已提交
933 934 935 936
		root_mountflags &= ~MS_RDONLY;
	init_mm.start_code = (unsigned long) _text;
	init_mm.end_code = (unsigned long) _etext;
	init_mm.end_data = (unsigned long) _edata;
937
	init_mm.brk = _brk_end;
L
Linus Torvalds 已提交
938

939 940 941 942 943 944
	code_resource.start = __pa_symbol(_text);
	code_resource.end = __pa_symbol(_etext)-1;
	data_resource.start = __pa_symbol(_etext);
	data_resource.end = __pa_symbol(_edata)-1;
	bss_resource.start = __pa_symbol(__bss_start);
	bss_resource.end = __pa_symbol(__bss_stop)-1;
L
Linus Torvalds 已提交
945

946 947 948 949 950 951 952 953 954 955 956 957 958
#ifdef CONFIG_CMDLINE_BOOL
#ifdef CONFIG_CMDLINE_OVERRIDE
	strlcpy(boot_command_line, builtin_cmdline, COMMAND_LINE_SIZE);
#else
	if (builtin_cmdline[0]) {
		/* append boot loader cmdline to builtin */
		strlcat(builtin_cmdline, " ", COMMAND_LINE_SIZE);
		strlcat(builtin_cmdline, boot_command_line, COMMAND_LINE_SIZE);
		strlcpy(boot_command_line, builtin_cmdline, COMMAND_LINE_SIZE);
	}
#endif
#endif

959 960 961 962
	strlcpy(command_line, boot_command_line, COMMAND_LINE_SIZE);
	*cmdline_p = command_line;

	/*
963 964 965 966 967
	 * x86_configure_nx() is called before parse_early_param() to detect
	 * whether hardware doesn't support NX (so that the early EHCI debug
	 * console setup can safely call set_fixmap()). It may then be called
	 * again from within noexec_setup() during parsing early parameters
	 * to honor the respective command line option.
968
	 */
969
	x86_configure_nx();
970 971 972

	parse_early_param();

973
	x86_report_nx();
974

975
	/* after early param, so could get panic from serial */
976
	memblock_x86_reserve_range_setup_data();
977

978
	if (acpi_mps_check()) {
I
Ingo Molnar 已提交
979
#ifdef CONFIG_X86_LOCAL_APIC
980
		disable_apic = 1;
I
Ingo Molnar 已提交
981
#endif
982
		setup_clear_cpu_cap(X86_FEATURE_APIC);
983 984
	}

985 986 987 988 989
#ifdef CONFIG_PCI
	if (pci_early_dump_regs)
		early_dump_pci_devices();
#endif

990
	finish_e820_parsing();
991

992
	if (efi_enabled(EFI_BOOT))
B
Brian Maly 已提交
993 994
		efi_init();

995
	dmi_scan_machine();
996
	dmi_memdev_walk();
997
	dmi_set_dump_stack_arch_desc();
998

999 1000 1001 1002
	/*
	 * VMware detection requires dmi to be available, so this
	 * needs to be done after dmi_scan_machine, for the BP.
	 */
1003
	init_hypervisor_platform();
1004

1005
	x86_init.resources.probe_roms();
1006 1007 1008 1009 1010 1011

	/* after parse_early_param, so could debug it */
	insert_resource(&iomem_resource, &code_resource);
	insert_resource(&iomem_resource, &data_resource);
	insert_resource(&iomem_resource, &bss_resource);

1012
	e820_add_kernel_range();
1013
	trim_bios_range();
1014
#ifdef CONFIG_X86_32
Y
Yinghai Lu 已提交
1015 1016 1017 1018 1019 1020 1021
	if (ppro_with_ram_bug()) {
		e820_update_range(0x70000000ULL, 0x40000ULL, E820_RAM,
				  E820_RESERVED);
		sanitize_e820_map(e820.map, ARRAY_SIZE(e820.map), &e820.nr_map);
		printk(KERN_INFO "fixed physical RAM map:\n");
		e820_print_map("bad_ppro");
	}
1022 1023 1024
#else
	early_gart_iommu_check();
#endif
Y
Yinghai Lu 已提交
1025

1026 1027 1028 1029
	/*
	 * partially used pages are not usable - thus
	 * we are rounding upwards:
	 */
1030
	max_pfn = e820_end_of_ram_pfn();
1031

1032 1033
	/* update e820 for memory not covered by WB MTRRs */
	mtrr_bp_init();
1034
	if (mtrr_trim_uncached_memory(max_pfn))
1035
		max_pfn = e820_end_of_ram_pfn();
1036

1037
#ifdef CONFIG_X86_32
1038
	/* max_low_pfn get updated here */
1039
	find_low_pfn_range();
1040
#else
Y
Yinghai Lu 已提交
1041
	check_x2apic();
1042 1043 1044

	/* How many end-of-memory variables you have, grandma! */
	/* need this before calling reserve_initrd */
1045 1046 1047 1048 1049
	if (max_pfn > (1UL<<(32 - PAGE_SHIFT)))
		max_low_pfn = e820_end_of_low_ram_pfn();
	else
		max_low_pfn = max_pfn;

1050
	high_memory = (void *)__va(max_pfn * PAGE_SIZE - 1) + 1;
1051 1052
#endif

1053 1054 1055 1056 1057
	/*
	 * Find and reserve possible boot-time SMP configuration:
	 */
	find_smp_config();

1058 1059
	reserve_ibft_region();

Y
Yinghai Lu 已提交
1060 1061
	early_alloc_pgt_buf();

1062 1063 1064 1065 1066 1067 1068
	/*
	 * Need to conclude brk, before memblock_x86_fill()
	 *  it could use memblock_find_in_range, could overlap with
	 *  brk area.
	 */
	reserve_brk();

1069 1070
	cleanup_highmap();

1071
	memblock_set_current_limit(ISA_END_ADDRESS);
1072 1073
	memblock_x86_fill();

1074 1075 1076 1077
	/*
	 * The EFI specification says that boot service code won't be called
	 * after ExitBootServices(). This is, in fact, a lie.
	 */
1078
	if (efi_enabled(EFI_MEMMAP))
1079 1080
		efi_reserve_boot_services();

1081 1082 1083 1084 1085 1086 1087
	/* preallocate 4k for mptable mpc */
	early_reserve_e820_mpc_new();

#ifdef CONFIG_X86_CHECK_BIOS_CORRUPTION
	setup_bios_corruption_check();
#endif

1088
#ifdef CONFIG_X86_32
1089 1090
	printk(KERN_DEBUG "initial memory mapped: [mem 0x00000000-%#010lx]\n",
			(max_pfn_mapped<<PAGE_SHIFT) - 1);
1091
#endif
1092

1093
	reserve_real_mode();
1094

1095
	trim_platform_memory_ranges();
1096
	trim_low_memory_range();
1097

1098
	init_mem_mapping();
1099

1100
	early_trap_pf_init();
1101

1102
	setup_real_mode();
1103

1104
	memblock_set_current_limit(get_max_mapped());
1105
	dma_contiguous_reserve(0);
1106

1107 1108 1109 1110 1111 1112 1113 1114
	/*
	 * NOTE: On x86-32, only from this point on, fixmaps are ready for use.
	 */

#ifdef CONFIG_PROVIDE_OHCI1394_DMA_INIT
	if (init_ohci1394_dma_early)
		init_ohci1394_dma_on_all_controllers();
#endif
1115 1116
	/* Allocate bigger log buffer */
	setup_log_buf(1);
1117

1118 1119
	reserve_initrd();

D
David Rientjes 已提交
1120
#if defined(CONFIG_ACPI) && defined(CONFIG_BLK_DEV_INITRD)
1121
	acpi_initrd_override((void *)initrd_start, initrd_end - initrd_start);
D
David Rientjes 已提交
1122
#endif
1123

1124 1125
	vsmp_init();

1126 1127 1128 1129 1130
	io_delay_init();

	/*
	 * Parse the ACPI tables for possible boot-time SMP configuration.
	 */
1131 1132 1133 1134
	acpi_boot_table_init();

	early_acpi_boot_init();

1135
	initmem_init();
1136 1137 1138 1139 1140 1141 1142

	/*
	 * Reserve memory for crash kernel after SRAT is parsed so that it
	 * won't consume hotpluggable memory.
	 */
	reserve_crashkernel();

1143
	memblock_find_dma_reserve();
1144

1145
#ifdef CONFIG_KVM_GUEST
1146 1147 1148
	kvmclock_init();
#endif

1149
	x86_init.paging.pagetable_init();
1150

1151 1152 1153
	if (boot_cpu_data.cpuid_level >= 0) {
		/* A CPU has %cr4 if and only if it has CPUID */
		mmu_cr4_features = read_cr4();
1154 1155
		if (trampoline_cr4_features)
			*trampoline_cr4_features = mmu_cr4_features;
1156 1157
	}

1158 1159 1160 1161 1162 1163
#ifdef CONFIG_X86_32
	/* sync back kernel address range */
	clone_pgd_range(initial_page_table + KERNEL_PGD_BOUNDARY,
			swapper_pg_dir     + KERNEL_PGD_BOUNDARY,
			KERNEL_PGD_PTRS);
#endif
1164

1165 1166
	tboot_probe();

1167 1168 1169 1170
#ifdef CONFIG_X86_64
	map_vsyscall();
#endif

1171
	generic_apic_probe();
L
Linus Torvalds 已提交
1172

1173
	early_quirks();
1174

1175 1176 1177
	/*
	 * Read APIC and some other early information from ACPI tables.
	 */
L
Linus Torvalds 已提交
1178
	acpi_boot_init();
F
Feng Tang 已提交
1179
	sfi_init();
1180
	x86_dtb_init();
1181

1182 1183 1184
	/*
	 * get boot-time SMP configuration:
	 */
1185 1186
	if (smp_found_config)
		get_smp_config();
1187

1188
	prefill_possible_map();
Y
Yinghai Lu 已提交
1189

1190 1191
	init_cpu_to_node();

1192
	init_apic_mappings();
I
Ingo Molnar 已提交
1193 1194
	if (x86_io_apic_ops.init)
		x86_io_apic_ops.init();
1195

1196
	kvm_guest_init();
L
Linus Torvalds 已提交
1197

1198
	e820_reserve_resources();
1199
	e820_mark_nosave_regions(max_low_pfn);
L
Linus Torvalds 已提交
1200

1201
	x86_init.resources.reserve_resources();
1202 1203 1204

	e820_setup_gap();

L
Linus Torvalds 已提交
1205 1206
#ifdef CONFIG_VT
#if defined(CONFIG_VGA_CONSOLE)
1207
	if (!efi_enabled(EFI_BOOT) || (efi_mem_type(0xa0000) != EFI_CONVENTIONAL_MEMORY))
L
Linus Torvalds 已提交
1208 1209 1210 1211 1212
		conswitchp = &vga_con;
#elif defined(CONFIG_DUMMY_CONSOLE)
	conswitchp = &dummy_con;
#endif
#endif
1213
	x86_init.oem.banner();
1214

1215 1216
	x86_init.timers.wallclock_init();

1217
	mcheck_init();
1218

1219
	arch_init_ideal_nops();
1220 1221

	register_refined_jiffies(CLOCK_TICK_RATE);
1222 1223

#ifdef CONFIG_EFI
1224 1225 1226
	/* Once setup is done above, unmap the EFI memory map on
	 * mismatched firmware/kernel archtectures since there is no
	 * support for runtime services.
1227
	 */
1228
	if (efi_enabled(EFI_BOOT) && !efi_is_native()) {
1229 1230 1231 1232
		pr_info("efi: Setup done, disabling due to 32/64-bit mismatch\n");
		efi_unmap_memmap();
	}
#endif
L
Linus Torvalds 已提交
1233
}
1234

1235 1236
#ifdef CONFIG_X86_32

1237 1238 1239 1240 1241
static struct resource video_ram_resource = {
	.name	= "Video RAM area",
	.start	= 0xa0000,
	.end	= 0xbffff,
	.flags	= IORESOURCE_BUSY | IORESOURCE_MEM
1242 1243
};

1244
void __init i386_reserve_resources(void)
1245
{
1246 1247
	request_resource(&iomem_resource, &video_ram_resource);
	reserve_standard_io_resources();
1248 1249 1250
}

#endif /* CONFIG_X86_32 */