Add support for Intel Sandybridge CPU
Change-Id: I9f37e291c00c0640c6600d8fdd6dcc13c3e5b8d5 Signed-off-by: Duncan Laurie <dlaurie@google.com> Signed-off-by: Stefan Reinauer <reinauer@google.com> Reviewed-on: http://review.coreboot.org/855 Tested-by: build bot (Jenkins) Reviewed-by: Ronald G. Minnich <rminnich@gmail.com>
This commit is contained in:
		| @@ -9,6 +9,7 @@ source src/cpu/intel/model_6ex/Kconfig | ||||
| source src/cpu/intel/model_6fx/Kconfig | ||||
| source src/cpu/intel/model_1067x/Kconfig | ||||
| source src/cpu/intel/model_106cx/Kconfig | ||||
| source src/cpu/intel/model_206ax/Kconfig | ||||
| source src/cpu/intel/model_f0x/Kconfig | ||||
| source src/cpu/intel/model_f1x/Kconfig | ||||
| source src/cpu/intel/model_f2x/Kconfig | ||||
| @@ -29,3 +30,4 @@ source src/cpu/intel/socket_mPGA604/Kconfig | ||||
| source src/cpu/intel/socket_PGA370/Kconfig | ||||
| source src/cpu/intel/socket_441/Kconfig | ||||
| source src/cpu/intel/socket_LGA771/Kconfig | ||||
| source src/cpu/intel/socket_rPGA989/Kconfig | ||||
|   | ||||
| @@ -14,6 +14,9 @@ subdirs-$(CONFIG_CPU_INTEL_SOCKET_MPGA479M) += socket_mPGA479M | ||||
| subdirs-$(CONFIG_CPU_INTEL_SOCKET_MPGA603) += socket_mPGA603 | ||||
| subdirs-$(CONFIG_CPU_INTEL_SOCKET_MPGA604) += socket_mPGA604 | ||||
| subdirs-$(CONFIG_CPU_INTEL_SOCKET_PGA370) += socket_PGA370 | ||||
| subdirs-$(CONFIG_CPU_INTEL_SOCKET_RPGA989) += socket_rPGA989 | ||||
| subdirs-$(CONFIG_NORTHBRIDGE_INTEL_SANDYBRIDGE) += model_206ax | ||||
| subdirs-$(CONFIG_NORTHBRIDGE_INTEL_IVYBRIDGE) += model_206ax | ||||
| subdirs-$(CONFIG_CPU_INTEL_SLOT_2) += slot_2 | ||||
| subdirs-$(CONFIG_CPU_INTEL_SLOT_1) += slot_1 | ||||
| subdirs-$(CONFIG_CPU_INTEL_SOCKET_LGA771) += socket_LGA771 | ||||
|   | ||||
| @@ -18,10 +18,10 @@ | ||||
| # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA | ||||
| # | ||||
|  | ||||
| MICROCODE_VERSION=20100914 | ||||
| MICROCODE_VERSION=20111110 | ||||
| MICROCODE_ARCHIVE=microcode-$MICROCODE_VERSION.tgz | ||||
| MICROCODE_FILE=microcode-$MICROCODE_VERSION.dat | ||||
| INTEL_MICROCODE=http://downloadmirror.intel.com/19342/eng/$MICROCODE_ARCHIVE | ||||
| MICROCODE_FILE=microcode.dat | ||||
| INTEL_MICROCODE=http://downloadmirror.intel.com/20728/eng/$MICROCODE_ARCHIVE | ||||
|  | ||||
| # | ||||
| # Getting Intel(R) Microcode | ||||
|   | ||||
							
								
								
									
										53
									
								
								src/cpu/intel/model_206ax/Kconfig
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										53
									
								
								src/cpu/intel/model_206ax/Kconfig
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,53 @@ | ||||
| config CPU_INTEL_MODEL_206AX | ||||
| 	bool | ||||
|  | ||||
| config CPU_INTEL_MODEL_306AX | ||||
| 	bool | ||||
|  | ||||
| if CPU_INTEL_MODEL_206AX || CPU_INTEL_MODEL_306AX | ||||
|  | ||||
| config CPU_SPECIFIC_OPTIONS | ||||
| 	def_bool y | ||||
| 	select SMP | ||||
| 	select SSE2 | ||||
| 	select UDELAY_LAPIC | ||||
| 	select SMM_TSEG | ||||
| 	#select AP_IN_SIPI_WAIT | ||||
|  | ||||
| config BOOTBLOCK_CPU_INIT | ||||
| 	string | ||||
| 	default "cpu/intel/model_206ax/bootblock.c" | ||||
|  | ||||
| config SERIAL_CPU_INIT | ||||
| 	bool | ||||
| 	default n | ||||
|  | ||||
| config SMM_TSEG_SIZE | ||||
| 	hex | ||||
| 	default 0x800000 | ||||
|  | ||||
| config ENABLE_VMX | ||||
| 	bool "Enable VMX for virtualization" | ||||
| 	default n | ||||
|  | ||||
| endif | ||||
|  | ||||
| if CPU_INTEL_MODEL_206AX | ||||
|    config CPU_MODEL_NAME | ||||
| 	string | ||||
| 	default "Intel SandyBridge CPU" | ||||
|  | ||||
|    config CPU_MODEL_INDEX | ||||
| 	hex | ||||
| 	default 0x2a | ||||
| endif | ||||
|  | ||||
| if CPU_INTEL_MODEL_306AX | ||||
|    config CPU_MODEL_NAME | ||||
| 	string | ||||
| 	default "Intel IvyBridge CPU" | ||||
|  | ||||
|    config CPU_MODEL_INDEX | ||||
| 	hex | ||||
| 	default 0x3a | ||||
| endif | ||||
							
								
								
									
										8
									
								
								src/cpu/intel/model_206ax/Makefile.inc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								src/cpu/intel/model_206ax/Makefile.inc
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,8 @@ | ||||
| driver-y += model_206ax_init.c | ||||
| subdirs-y += ../../x86/name | ||||
|  | ||||
| ramstage-$(CONFIG_GENERATE_ACPI_TABLES) += acpi.c | ||||
|  | ||||
| smm-$(CONFIG_HAVE_SMI_HANDLER) += finalize.c | ||||
|  | ||||
| cpu_incs += $(src)/cpu/intel/model_206ax/cache_as_ram.inc | ||||
							
								
								
									
										357
									
								
								src/cpu/intel/model_206ax/acpi.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										357
									
								
								src/cpu/intel/model_206ax/acpi.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,357 @@ | ||||
| /* | ||||
|  * This file is part of the coreboot project. | ||||
|  * | ||||
|  * Copyright (C) 2009 coresystems GmbH | ||||
|  * Copyright (C) 2011 The Chromium OS Authors. All rights reserved. | ||||
|  * | ||||
|  * This program is free software; you can redistribute it and/or | ||||
|  * modify it under the terms of the GNU General Public License as | ||||
|  * published by the Free Software Foundation; version 2 of | ||||
|  * the License. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License | ||||
|  * along with this program; if not, write to the Free Software | ||||
|  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, | ||||
|  * MA 02110-1301 USA | ||||
|  */ | ||||
|  | ||||
| #include <types.h> | ||||
| #include <console/console.h> | ||||
| #include <arch/acpi.h> | ||||
| #include <arch/acpigen.h> | ||||
| #include <arch/cpu.h> | ||||
| #include <cpu/x86/msr.h> | ||||
| #include <cpu/intel/acpi.h> | ||||
| #include <cpu/intel/speedstep.h> | ||||
| #include <cpu/intel/turbo.h> | ||||
| #include <device/device.h> | ||||
| #include <device/pci.h> | ||||
| #include "model_206ax.h" | ||||
| #include "chip.h" | ||||
|  | ||||
| static int get_cores_per_package(void) | ||||
| { | ||||
| 	struct cpuinfo_x86 c; | ||||
| 	struct cpuid_result result; | ||||
| 	int cores = 1; | ||||
|  | ||||
| 	get_fms(&c, cpuid_eax(1)); | ||||
| 	if (c.x86 != 6) | ||||
| 		return 1; | ||||
|  | ||||
| 	switch (c.x86_model) { | ||||
| 	case CONFIG_CPU_MODEL_INDEX: | ||||
| 		result = cpuid_ext(0xb, 1); | ||||
| 		cores = result.ebx & 0xff; | ||||
| 		break; | ||||
| 	default: | ||||
| 		cores = (cpuid_ebx(1) >> 16) & 0xff; | ||||
| 		break; | ||||
| 	} | ||||
|  | ||||
| 	return cores; | ||||
| } | ||||
|  | ||||
| static int generate_cstate_entries(acpi_cstate_t *cstates, | ||||
| 				   int c1, int c2, int c3) | ||||
| { | ||||
| 	int length, cstate_count = 0; | ||||
|  | ||||
| 	/* Count number of active C-states */ | ||||
| 	if (c1 > 0) | ||||
| 		++cstate_count; | ||||
| 	if (c2 > 0) | ||||
| 		++cstate_count; | ||||
| 	if (c3 > 0) | ||||
| 		++cstate_count; | ||||
| 	if (!cstate_count) | ||||
| 		return 0; | ||||
|  | ||||
| 	length = acpigen_write_package(cstate_count + 1); | ||||
| 	length += acpigen_write_byte(cstate_count); | ||||
|  | ||||
| 	/* Add an entry if the level is enabled */ | ||||
| 	if (c1 > 0) | ||||
| 		length += acpigen_write_CST_package(1, &cstates[c1]); | ||||
| 	if (c2 > 0) | ||||
| 		length += acpigen_write_CST_package(2, &cstates[c2]); | ||||
| 	if (c3 > 0) | ||||
| 		length += acpigen_write_CST_package(3, &cstates[c3]); | ||||
|  | ||||
| 	acpigen_patch_len(length - 1); | ||||
| 	return length; | ||||
| } | ||||
|  | ||||
| static int generate_C_state_entries(void) | ||||
| { | ||||
| 	struct cpu_info *info; | ||||
| 	struct cpu_driver *cpu; | ||||
| 	int len, lenif; | ||||
| 	device_t lapic; | ||||
| 	struct cpu_intel_model_206ax_config *conf = NULL; | ||||
|  | ||||
| 	/* Find the SpeedStep CPU in the device tree using magic APIC ID */ | ||||
| 	lapic = dev_find_lapic(SPEEDSTEP_APIC_MAGIC); | ||||
| 	if (!lapic) | ||||
| 		return 0; | ||||
| 	conf = lapic->chip_info; | ||||
| 	if (!conf) | ||||
| 		return 0; | ||||
|  | ||||
| 	/* Find CPU map of supported C-states */ | ||||
| 	info = cpu_info(); | ||||
| 	if (!info) | ||||
| 		return 0; | ||||
| 	cpu = find_cpu_driver(info->cpu); | ||||
| 	if (!cpu || !cpu->cstates) | ||||
| 		return 0; | ||||
|  | ||||
| 	len = acpigen_emit_byte(0x14);		/* MethodOp */ | ||||
| 	len += acpigen_write_len_f();		/* PkgLength */ | ||||
| 	len += acpigen_emit_namestring("_CST"); | ||||
| 	len += acpigen_emit_byte(0x00);		/* No Arguments */ | ||||
|  | ||||
| 	/* If running on AC power */ | ||||
| 	len += acpigen_emit_byte(0xa0);		/* IfOp */ | ||||
| 	lenif = acpigen_write_len_f();		/* PkgLength */ | ||||
| 	lenif += acpigen_emit_namestring("PWRS"); | ||||
| 	lenif += acpigen_emit_byte(0xa4);	/* ReturnOp */ | ||||
| 	lenif += generate_cstate_entries(cpu->cstates, conf->c1_acpower, | ||||
| 					 conf->c2_acpower, conf->c3_acpower); | ||||
| 	acpigen_patch_len(lenif - 1); | ||||
| 	len += lenif; | ||||
|  | ||||
| 	/* Else on battery power */ | ||||
| 	len += acpigen_emit_byte(0xa4);	/* ReturnOp */ | ||||
| 	len += generate_cstate_entries(cpu->cstates, conf->c1_battery, | ||||
| 					conf->c2_battery, conf->c3_battery); | ||||
| 	acpigen_patch_len(len - 1); | ||||
| 	return len; | ||||
| } | ||||
|  | ||||
| static acpi_tstate_t tss_table_fine[] = { | ||||
| 	{ 100, 1000, 0, 0x00, 0 }, | ||||
| 	{ 94, 940, 0, 0x1f, 0 }, | ||||
| 	{ 88, 880, 0, 0x1e, 0 }, | ||||
| 	{ 82, 820, 0, 0x1d, 0 }, | ||||
| 	{ 75, 760, 0, 0x1c, 0 }, | ||||
| 	{ 69, 700, 0, 0x1b, 0 }, | ||||
| 	{ 63, 640, 0, 0x1a, 0 }, | ||||
| 	{ 57, 580, 0, 0x19, 0 }, | ||||
| 	{ 50, 520, 0, 0x18, 0 }, | ||||
| 	{ 44, 460, 0, 0x17, 0 }, | ||||
| 	{ 38, 400, 0, 0x16, 0 }, | ||||
| 	{ 32, 340, 0, 0x15, 0 }, | ||||
| 	{ 25, 280, 0, 0x14, 0 }, | ||||
| 	{ 19, 220, 0, 0x13, 0 }, | ||||
| 	{ 13, 160, 0, 0x12, 0 }, | ||||
| }; | ||||
|  | ||||
| static acpi_tstate_t tss_table_coarse[] = { | ||||
| 	{ 100, 1000, 0, 0x00, 0 }, | ||||
| 	{ 88, 875, 0, 0x1f, 0 }, | ||||
| 	{ 75, 750, 0, 0x1e, 0 }, | ||||
| 	{ 63, 625, 0, 0x1d, 0 }, | ||||
| 	{ 50, 500, 0, 0x1c, 0 }, | ||||
| 	{ 38, 375, 0, 0x1b, 0 }, | ||||
| 	{ 25, 250, 0, 0x1a, 0 }, | ||||
| 	{ 13, 125, 0, 0x19, 0 }, | ||||
| }; | ||||
|  | ||||
| static int generate_T_state_entries(int core, int cores_per_package) | ||||
| { | ||||
| 	int len; | ||||
|  | ||||
| 	/* Indicate SW_ALL coordination for T-states */ | ||||
| 	len = acpigen_write_TSD_package(core, cores_per_package, SW_ALL); | ||||
|  | ||||
| 	/* Indicate FFixedHW so OS will use MSR */ | ||||
| 	len += acpigen_write_empty_PTC(); | ||||
|  | ||||
| 	/* Set a T-state limit that can be modified in NVS */ | ||||
| 	len += acpigen_write_TPC("\\TLVL"); | ||||
|  | ||||
| 	/* | ||||
| 	 * CPUID.(EAX=6):EAX[5] indicates support | ||||
| 	 * for extended throttle levels. | ||||
| 	 */ | ||||
| 	if (cpuid_eax(6) & (1 << 5)) | ||||
| 		len += acpigen_write_TSS_package( | ||||
| 			ARRAY_SIZE(tss_table_fine), tss_table_fine); | ||||
| 	else | ||||
| 		len += acpigen_write_TSS_package( | ||||
| 			ARRAY_SIZE(tss_table_coarse), tss_table_coarse); | ||||
|  | ||||
| 	return len; | ||||
| } | ||||
|  | ||||
| static int calculate_power(int tdp, int p1_ratio, int ratio) | ||||
| { | ||||
| 	u32 m; | ||||
| 	u32 power; | ||||
|  | ||||
| 	/* | ||||
| 	 * M = ((1.1 - ((p1_ratio - ratio) * 0.00625)) / 1.1) ^ 2 | ||||
| 	 * | ||||
| 	 * Power = (ratio / p1_ratio) * m * tdp | ||||
| 	 */ | ||||
|  | ||||
| 	m = (110000 - ((p1_ratio - ratio) * 625)) / 11; | ||||
| 	m = (m * m) / 1000; | ||||
|  | ||||
| 	power = ((ratio * 100000 / p1_ratio) / 100); | ||||
| 	power *= (m / 100) * (tdp / 1000); | ||||
| 	power /= 1000; | ||||
|  | ||||
| 	return (int)power; | ||||
| } | ||||
|  | ||||
| static int generate_P_state_entries(int core, int cores_per_package) | ||||
| { | ||||
| 	int len, len_pss; | ||||
| 	int ratio_min, ratio_max, ratio_turbo, ratio_step; | ||||
| 	int coord_type, power_max, power_unit, num_entries; | ||||
| 	int ratio, power, clock, clock_max; | ||||
| 	msr_t msr; | ||||
|  | ||||
| 	/* Determine P-state coordination type from MISC_PWR_MGMT[0] */ | ||||
| 	msr = rdmsr(MSR_MISC_PWR_MGMT); | ||||
| 	if (msr.lo & MISC_PWR_MGMT_EIST_HW_DIS) | ||||
| 		coord_type = SW_ANY; | ||||
| 	else | ||||
| 		coord_type = HW_ALL; | ||||
|  | ||||
| 	/* Get bus ratio limits and calculate clock speeds */ | ||||
| 	msr = rdmsr(MSR_PLATFORM_INFO); | ||||
| 	ratio_min = (msr.hi >> (40-32)) & 0xff; /* Max Efficiency Ratio */ | ||||
| 	ratio_max = (msr.lo >> 8) & 0xff;       /* Max Non-Turbo Ratio */ | ||||
| 	clock_max = ratio_max * SANDYBRIDGE_BCLK; | ||||
|  | ||||
| 	/* Calculate CPU TDP in mW */ | ||||
| 	msr = rdmsr(MSR_PKG_POWER_SKU_UNIT); | ||||
| 	power_unit = 2 << ((msr.lo & 0xf) - 1); | ||||
| 	msr = rdmsr(MSR_PKG_POWER_SKU); | ||||
| 	power_max = ((msr.lo & 0x7fff) / power_unit) * 1000; | ||||
|  | ||||
| 	/* Write _PCT indicating use of FFixedHW */ | ||||
| 	len = acpigen_write_empty_PCT(); | ||||
|  | ||||
| 	/* Write _PPC with no limit on supported P-state */ | ||||
| 	len += acpigen_write_PPC(0); | ||||
|  | ||||
| 	/* Write PSD indicating configured coordination type */ | ||||
| 	len += acpigen_write_PSD_package(core, cores_per_package, coord_type); | ||||
|  | ||||
| 	/* Add P-state entries in _PSS table */ | ||||
| 	len += acpigen_write_name("_PSS"); | ||||
|  | ||||
| 	/* Determine ratio points */ | ||||
| 	ratio_step = PSS_RATIO_STEP; | ||||
| 	num_entries = (ratio_max - ratio_min) / ratio_step; | ||||
| 	while (num_entries > PSS_MAX_ENTRIES-1) { | ||||
| 		ratio_step <<= 1; | ||||
| 		num_entries >>= 1; | ||||
| 	} | ||||
|  | ||||
| 	/* P[T] is Turbo state if enabled */ | ||||
| 	if (get_turbo_state() == TURBO_ENABLED) { | ||||
| 		/* _PSS package count including Turbo */ | ||||
| 		len_pss = acpigen_write_package(num_entries + 2); | ||||
|  | ||||
| 		msr = rdmsr(MSR_TURBO_RATIO_LIMIT); | ||||
| 		ratio_turbo = msr.lo & 0xff; | ||||
|  | ||||
| 		/* Add entry for Turbo ratio */ | ||||
| 		len_pss += acpigen_write_PSS_package( | ||||
| 			clock_max + 1,		/*MHz*/ | ||||
| 			power_max,		/*mW*/ | ||||
| 			PSS_LATENCY_TRANSITION,	/*lat1*/ | ||||
| 			PSS_LATENCY_BUSMASTER,	/*lat2*/ | ||||
| 			ratio_turbo << 8,	/*control*/ | ||||
| 			ratio_turbo << 8);	/*status*/ | ||||
| 	} else { | ||||
| 		/* _PSS package count without Turbo */ | ||||
| 		len_pss = acpigen_write_package(num_entries + 1); | ||||
| 	} | ||||
|  | ||||
| 	/* First regular entry is max non-turbo ratio */ | ||||
| 	len_pss += acpigen_write_PSS_package( | ||||
| 		clock_max,		/*MHz*/ | ||||
| 		power_max,		/*mW*/ | ||||
| 		PSS_LATENCY_TRANSITION,	/*lat1*/ | ||||
| 		PSS_LATENCY_BUSMASTER,	/*lat2*/ | ||||
| 		ratio_max << 8,		/*control*/ | ||||
| 		ratio_max << 8);	/*status*/ | ||||
|  | ||||
| 	/* Generate the remaining entries */ | ||||
| 	for (ratio = ratio_min + ((num_entries - 1) * ratio_step); | ||||
| 	     ratio >= ratio_min; ratio -= ratio_step) { | ||||
|  | ||||
| 		/* Calculate power at this ratio */ | ||||
| 		power = calculate_power(power_max, ratio_max, ratio); | ||||
| 		clock = ratio * SANDYBRIDGE_BCLK; | ||||
|  | ||||
| 		len_pss += acpigen_write_PSS_package( | ||||
| 			clock,			/*MHz*/ | ||||
| 			power,			/*mW*/ | ||||
| 			PSS_LATENCY_TRANSITION,	/*lat1*/ | ||||
| 			PSS_LATENCY_BUSMASTER,	/*lat2*/ | ||||
| 			ratio << 8,		/*control*/ | ||||
| 			ratio << 8);		/*status*/ | ||||
| 	} | ||||
|  | ||||
| 	/* Fix package length */ | ||||
| 	len_pss--; | ||||
| 	acpigen_patch_len(len_pss); | ||||
|  | ||||
| 	return len + len_pss; | ||||
| } | ||||
|  | ||||
| void generate_cpu_entries(void) | ||||
| { | ||||
| 	int len_pr; | ||||
| 	int coreID, cpuID, pcontrol_blk = PMB0_BASE, plen = 6; | ||||
| 	int totalcores = dev_count_cpu(); | ||||
| 	int cores_per_package = get_cores_per_package(); | ||||
| 	int numcpus = totalcores/cores_per_package; | ||||
|  | ||||
| 	printk(BIOS_DEBUG, "Found %d CPU(s) with %d core(s) each.\n", | ||||
| 	       numcpus, cores_per_package); | ||||
|  | ||||
| 	for (cpuID=1; cpuID <=numcpus; cpuID++) { | ||||
| 		for (coreID=1; coreID<=cores_per_package; coreID++) { | ||||
| 			if (coreID>1) { | ||||
| 				pcontrol_blk = 0; | ||||
| 				plen = 0; | ||||
| 			} | ||||
|  | ||||
| 			/* Generate processor \_PR.CPUx */ | ||||
| 			len_pr = acpigen_write_processor( | ||||
| 				(cpuID-1)*cores_per_package+coreID-1, | ||||
| 				pcontrol_blk, plen); | ||||
|  | ||||
| 			/* Generate P-state tables */ | ||||
| 			len_pr += generate_P_state_entries( | ||||
| 				cpuID-1, cores_per_package); | ||||
|  | ||||
| 			/* Generate C-state tables */ | ||||
| 			len_pr += generate_C_state_entries(); | ||||
|  | ||||
| 			/* Generate T-state tables */ | ||||
| 			len_pr += generate_T_state_entries( | ||||
| 				cpuID-1, cores_per_package); | ||||
|  | ||||
| 			len_pr--; | ||||
| 			acpigen_patch_len(len_pr); | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| struct chip_operations cpu_intel_model_206ax_ops = { | ||||
| 	CHIP_NAME(CONFIG_CPU_MODEL_NAME) | ||||
| }; | ||||
							
								
								
									
										91
									
								
								src/cpu/intel/model_206ax/acpi/cpu.asl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										91
									
								
								src/cpu/intel/model_206ax/acpi/cpu.asl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,91 @@ | ||||
| /* | ||||
|  * This file is part of the coreboot project. | ||||
|  * | ||||
|  * Copyright (C) 2011 The ChromiumOS Authors.  All rights reserved. | ||||
|  * | ||||
|  * This program is free software; you can redistribute it and/or | ||||
|  * modify it under the terms of the GNU General Public License as | ||||
|  * published by the Free Software Foundation; version 2 of | ||||
|  * the License. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License | ||||
|  * along with this program; if not, write to the Free Software | ||||
|  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, | ||||
|  * MA 02110-1301 USA | ||||
|  */ | ||||
|  | ||||
| /* These devices are created at runtime */ | ||||
| External (\_PR.CPU0, DeviceObj) | ||||
| External (\_PR.CPU1, DeviceObj) | ||||
| External (\_PR.CPU2, DeviceObj) | ||||
| External (\_PR.CPU3, DeviceObj) | ||||
| External (\_PR.CPU4, DeviceObj) | ||||
| External (\_PR.CPU5, DeviceObj) | ||||
| External (\_PR.CPU6, DeviceObj) | ||||
| External (\_PR.CPU7, DeviceObj) | ||||
|  | ||||
| /* Notify OS to re-read CPU tables, assuming ^2 CPU count */ | ||||
| Method (PNOT) | ||||
| { | ||||
| 	If (LGreaterEqual (\PCNT, 2)) { | ||||
| 		Notify (\_PR.CPU0, 0x80)  // _PPC | ||||
| 		Notify (\_PR.CPU0, 0x81)  // _CST | ||||
| 		Notify (\_PR.CPU1, 0x80)  // _PPC | ||||
| 		Notify (\_PR.CPU1, 0x81)  // _CST | ||||
| 	} | ||||
| 	If (LGreaterEqual (\PCNT, 4)) { | ||||
| 		Notify (\_PR.CPU2, 0x80)  // _PPC | ||||
| 		Notify (\_PR.CPU2, 0x81)  // _CST | ||||
| 		Notify (\_PR.CPU3, 0x80)  // _PPC | ||||
| 		Notify (\_PR.CPU3, 0x81)  // _CST | ||||
| 	} | ||||
| 	If (LGreaterEqual (\PCNT, 8)) { | ||||
| 		Notify (\_PR.CPU4, 0x80)  // _PPC | ||||
| 		Notify (\_PR.CPU4, 0x81)  // _CST | ||||
| 		Notify (\_PR.CPU5, 0x80)  // _PPC | ||||
| 		Notify (\_PR.CPU5, 0x81)  // _CST | ||||
| 		Notify (\_PR.CPU6, 0x80)  // _PPC | ||||
| 		Notify (\_PR.CPU6, 0x81)  // _CST | ||||
| 		Notify (\_PR.CPU7, 0x80)  // _PPC | ||||
| 		Notify (\_PR.CPU7, 0x81)  // _CST | ||||
| 	} | ||||
| } | ||||
|  | ||||
| /* Notify OS to re-read Throttle Limit tables, assuming ^2 CPU count */ | ||||
| Method (TNOT) | ||||
| { | ||||
| 	If (LGreaterEqual (\PCNT, 2)) { | ||||
| 		Notify (\_PR.CPU0, 0x82)  // _TPC | ||||
| 		Notify (\_PR.CPU1, 0x82)  // _TPC | ||||
| 	} | ||||
| 	If (LGreaterEqual (\PCNT, 4)) { | ||||
| 		Notify (\_PR.CPU2, 0x82)  // _TPC | ||||
| 		Notify (\_PR.CPU3, 0x82)  // _TPC | ||||
| 	} | ||||
| 	If (LGreaterEqual (\PCNT, 8)) { | ||||
| 		Notify (\_PR.CPU4, 0x82)  // _TPC | ||||
| 		Notify (\_PR.CPU5, 0x82)  // _TPC | ||||
| 		Notify (\_PR.CPU6, 0x82)  // _TPC | ||||
| 		Notify (\_PR.CPU7, 0x82)  // _TPC | ||||
| 	} | ||||
| } | ||||
|  | ||||
| /* Return a package containing enabled processor entries */ | ||||
| Method (PPKG) | ||||
| { | ||||
| 	If (LGreaterEqual (\PCNT, 8)) { | ||||
| 		Return (Package() {\_PR.CPU0, \_PR.CPU1, \_PR.CPU2, \_PR.CPU3, | ||||
| 				   \_PR.CPU4, \_PR.CPU5, \_PR.CPU6, \_PR.CPU7}) | ||||
| 	} ElseIf (LGreaterEqual (\PCNT, 4)) { | ||||
| 		Return (Package() {\_PR.CPU0, \_PR.CPU1, \_PR.CPU2, \_PR.CPU3}) | ||||
| 	} ElseIf (LGreaterEqual (\PCNT, 2)) { | ||||
| 		Return (Package() {\_PR.CPU0, \_PR.CPU1}) | ||||
| 	} Else { | ||||
| 		Return (Package() {\_PR.CPU0}) | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										152
									
								
								src/cpu/intel/model_206ax/bootblock.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										152
									
								
								src/cpu/intel/model_206ax/bootblock.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,152 @@ | ||||
| /* | ||||
|  * This file is part of the coreboot project. | ||||
|  * | ||||
|  * Copyright (C) 2011 Google Inc. | ||||
|  * | ||||
|  * This program is free software; you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  * the Free Software Foundation; version 2 of the License. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License | ||||
|  * along with this program; if not, write to the Free Software | ||||
|  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA | ||||
|  */ | ||||
|  | ||||
| #include <stdint.h> | ||||
| #include <arch/cpu.h> | ||||
| #include <cpu/x86/cache.h> | ||||
| #include <cpu/x86/msr.h> | ||||
| #include <cpu/x86/mtrr.h> | ||||
|  | ||||
| static const uint32_t microcode_updates[] = { | ||||
| 	#include "x06_microcode.h" | ||||
| }; | ||||
|  | ||||
| struct microcode { | ||||
| 	u32 hdrver;	/* Header Version */ | ||||
| 	u32 rev;	/* Patch ID       */ | ||||
| 	u32 date;	/* DATE           */ | ||||
| 	u32 sig;	/* CPUID          */ | ||||
|  | ||||
| 	u32 cksum;	/* Checksum       */ | ||||
| 	u32 ldrver;	/* Loader Version */ | ||||
| 	u32 pf;		/* Platform ID    */ | ||||
|  | ||||
| 	u32 data_size;	/* Data size      */ | ||||
| 	u32 total_size;	/* Total size     */ | ||||
|  | ||||
| 	u32 reserved[3]; | ||||
| 	u32 bits[1012]; | ||||
| }; | ||||
|  | ||||
| static inline u32 read_microcode_rev(void) | ||||
| { | ||||
| 	/* Some Intel Cpus can be very finicky about the | ||||
| 	 * CPUID sequence used.  So this is implemented in | ||||
| 	 * assembly so that it works reliably. | ||||
| 	 */ | ||||
| 	msr_t msr; | ||||
| 	__asm__ volatile ( | ||||
| 		"wrmsr\n\t" | ||||
| 		"xorl %%eax, %%eax\n\t" | ||||
| 		"xorl %%edx, %%edx\n\t" | ||||
| 		"movl $0x8b, %%ecx\n\t" | ||||
| 		"wrmsr\n\t" | ||||
| 		"movl $0x01, %%eax\n\t" | ||||
| 		"cpuid\n\t" | ||||
| 		"movl $0x08b, %%ecx\n\t" | ||||
| 		"rdmsr \n\t" | ||||
| 		: /* outputs */ | ||||
| 		"=a" (msr.lo), "=d" (msr.hi) | ||||
| 		: /* inputs */ | ||||
| 		: /* trashed */ | ||||
| 		 "ecx" | ||||
| 	); | ||||
| 	return msr.hi; | ||||
| } | ||||
|  | ||||
| void intel_update_microcode(const void *microcode_updates) | ||||
| { | ||||
| 	unsigned int eax; | ||||
| 	unsigned int pf, rev, sig; | ||||
| 	unsigned int x86_model, x86_family; | ||||
| 	const struct microcode *m; | ||||
| 	const char *c; | ||||
| 	msr_t msr; | ||||
|  | ||||
| 	/* cpuid sets msr 0x8B iff a microcode update has been loaded. */ | ||||
| 	msr.lo = 0; | ||||
| 	msr.hi = 0; | ||||
| 	wrmsr(0x8B, msr); | ||||
| 	eax = cpuid_eax(1); | ||||
| 	msr = rdmsr(0x8B); | ||||
| 	rev = msr.hi; | ||||
| 	x86_model = (eax >>4) & 0x0f; | ||||
| 	x86_family = (eax >>8) & 0x0f; | ||||
| 	sig = eax; | ||||
|  | ||||
| 	pf = 0; | ||||
| 	if ((x86_model >= 5)||(x86_family>6)) { | ||||
| 		msr = rdmsr(0x17); | ||||
| 		pf = 1 << ((msr.hi >> 18) & 7); | ||||
| 	} | ||||
|  | ||||
| 	m = microcode_updates; | ||||
| 	for(c = microcode_updates; m->hdrver;  m = (const struct microcode *)c) { | ||||
| 		if ((m->sig == sig) && (m->pf & pf)) { | ||||
| 			unsigned int new_rev; | ||||
| 			msr.lo = (unsigned long)(&m->bits) & 0xffffffff; | ||||
| 			msr.hi = 0; | ||||
| 			wrmsr(0x79, msr); | ||||
|  | ||||
| 			/* Read back the new microcode version */ | ||||
| 			new_rev = read_microcode_rev(); | ||||
| 			break; | ||||
| 		} | ||||
| 		if (m->total_size) { | ||||
| 			c += m->total_size; | ||||
| 		} else { | ||||
| 			c += 2048; | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| static void set_var_mtrr( | ||||
| 	unsigned reg, unsigned base, unsigned size, unsigned type) | ||||
|  | ||||
| { | ||||
| 	/* Bit Bit 32-35 of MTRRphysMask should be set to 1 */ | ||||
| 	/* FIXME: It only support 4G less range */ | ||||
| 	msr_t basem, maskm; | ||||
| 	basem.lo = base | type; | ||||
| 	basem.hi = 0; | ||||
| 	wrmsr(MTRRphysBase_MSR(reg), basem); | ||||
| 	maskm.lo = ~(size - 1) | MTRRphysMaskValid; | ||||
| 	maskm.hi = (1 << (CONFIG_CPU_ADDR_BITS - 32)) - 1; | ||||
| 	wrmsr(MTRRphysMask_MSR(reg), maskm); | ||||
| } | ||||
|  | ||||
| static void enable_rom_caching(void) | ||||
| { | ||||
| 	msr_t msr; | ||||
|  | ||||
| 	disable_cache(); | ||||
| 	set_var_mtrr(1, 0xffc00000, 4*1024*1024, MTRR_TYPE_WRPROT); | ||||
| 	enable_cache(); | ||||
|  | ||||
| 	/* Enable Variable MTRRs */ | ||||
| 	msr.hi = 0x00000000; | ||||
| 	msr.lo = 0x00000800; | ||||
| 	wrmsr(MTRRdefType_MSR, msr); | ||||
| } | ||||
|  | ||||
| static void bootblock_cpu_init(void) | ||||
| { | ||||
| 	enable_rom_caching(); | ||||
| 	intel_update_microcode(microcode_updates); | ||||
| } | ||||
							
								
								
									
										348
									
								
								src/cpu/intel/model_206ax/cache_as_ram.inc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										348
									
								
								src/cpu/intel/model_206ax/cache_as_ram.inc
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,348 @@ | ||||
| /* | ||||
|  * This file is part of the coreboot project. | ||||
|  * | ||||
|  * Copyright (C) 2000,2007 Ronald G. Minnich <rminnich@gmail.com> | ||||
|  * Copyright (C) 2007-2008 coresystems GmbH | ||||
|  * | ||||
|  * This program is free software; you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  * the Free Software Foundation; version 2 of the License. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License | ||||
|  * along with this program; if not, write to the Free Software | ||||
|  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA | ||||
|  */ | ||||
|  | ||||
| #include <cpu/x86/stack.h> | ||||
| #include <cpu/x86/mtrr.h> | ||||
| #include <cpu/x86/post_code.h> | ||||
| #include <cbmem.h> | ||||
|  | ||||
| #define CACHE_AS_RAM_SIZE CONFIG_DCACHE_RAM_SIZE | ||||
| #define CACHE_AS_RAM_BASE CONFIG_DCACHE_RAM_BASE | ||||
|  | ||||
| /* Cache 4GB - MRC_SIZE_KB for MRC */ | ||||
| #define CACHE_MRC_BYTES   ((CONFIG_CACHE_MRC_SIZE_KB << 10) - 1) | ||||
| #define CACHE_MRC_BASE    (0xFFFFFFFF - CACHE_MRC_BYTES) | ||||
| #define CACHE_MRC_MASK    (~CACHE_MRC_BYTES) | ||||
|  | ||||
| #define CPU_MAXPHYSADDR 36 | ||||
| #define CPU_PHYSMASK_HI  (1 << (CPU_MAXPHYSADDR - 32) - 1) | ||||
|  | ||||
| #define NoEvictMod_MSR 0x2e0 | ||||
|  | ||||
| 	/* Save the BIST result. */ | ||||
| 	movl	%eax, %ebp | ||||
|  | ||||
| cache_as_ram: | ||||
| 	post_code(0x20) | ||||
|  | ||||
| 	/* Send INIT IPI to all excluding ourself. */ | ||||
| 	movl	$0x000C4500, %eax | ||||
| 	movl	$0xFEE00300, %esi | ||||
| 	movl	%eax, (%esi) | ||||
|  | ||||
| 	/* All CPUs need to be in Wait for SIPI state */ | ||||
| wait_for_sipi: | ||||
| 	movl	(%esi), %eax | ||||
| 	bt	$12, %eax | ||||
| 	jc	wait_for_sipi | ||||
|  | ||||
| 	post_code(0x21) | ||||
| 	/* Zero out all fixed range and variable range MTRRs. */ | ||||
| 	movl	$mtrr_table, %esi | ||||
| 	movl	$((mtrr_table_end - mtrr_table) / 2), %edi | ||||
| 	xorl	%eax, %eax | ||||
| 	xorl	%edx, %edx | ||||
| clear_mtrrs: | ||||
| 	movw	(%esi), %bx | ||||
| 	movzx	%bx, %ecx | ||||
| 	wrmsr | ||||
| 	add	$2, %esi | ||||
| 	dec	%edi | ||||
| 	jnz	clear_mtrrs | ||||
|  | ||||
| 	post_code(0x22) | ||||
| 	/* Configure the default memory type to uncacheable. */ | ||||
| 	movl	$MTRRdefType_MSR, %ecx | ||||
| 	rdmsr | ||||
| 	andl	$(~0x00000cff), %eax | ||||
| 	wrmsr | ||||
|  | ||||
| 	post_code(0x23) | ||||
| 	/* Set Cache-as-RAM base address. */ | ||||
| 	movl	$(MTRRphysBase_MSR(0)), %ecx | ||||
| 	movl	$(CACHE_AS_RAM_BASE | MTRR_TYPE_WRBACK), %eax | ||||
| 	xorl	%edx, %edx | ||||
| 	wrmsr | ||||
|  | ||||
| 	post_code(0x24) | ||||
| 	/* Set Cache-as-RAM mask. */ | ||||
| 	movl	$(MTRRphysMask_MSR(0)), %ecx | ||||
| 	movl	$(~(CACHE_AS_RAM_SIZE - 1) | MTRRphysMaskValid), %eax | ||||
| 	movl	$CPU_PHYSMASK_HI, %edx | ||||
| 	wrmsr | ||||
|  | ||||
| 	post_code(0x25) | ||||
|  | ||||
| 	/* Enable MTRR. */ | ||||
| 	movl	$MTRRdefType_MSR, %ecx | ||||
| 	rdmsr | ||||
| 	orl	$MTRRdefTypeEn, %eax | ||||
| 	wrmsr | ||||
|  | ||||
| 	/* Enable cache (CR0.CD = 0, CR0.NW = 0). */ | ||||
|         movl	%cr0, %eax | ||||
| 	andl	$(~((1 << 30) | (1 << 29))), %eax | ||||
| 	invd | ||||
| 	movl	%eax, %cr0 | ||||
|  | ||||
| 	/* enable the 'no eviction' mode */ | ||||
| 	movl    $NoEvictMod_MSR, %ecx | ||||
| 	rdmsr | ||||
| 	orl     $1, %eax | ||||
| 	andl    $~2, %eax | ||||
| 	wrmsr | ||||
|  | ||||
|        /* Clear the cache memory region. This will also fill up the cache */ | ||||
| 	movl	$CACHE_AS_RAM_BASE, %esi | ||||
| 	movl	%esi, %edi | ||||
| 	movl	$(CACHE_AS_RAM_SIZE / 4), %ecx | ||||
| 	// movl	$0x23322332, %eax | ||||
| 	xorl	%eax, %eax | ||||
| 	rep	stosl | ||||
|  | ||||
| 	/* enable the 'no eviction run' state */ | ||||
| 	movl    $NoEvictMod_MSR, %ecx | ||||
| 	rdmsr | ||||
| 	orl     $3, %eax | ||||
| 	wrmsr | ||||
|  | ||||
| 	post_code(0x26) | ||||
| 	/* Enable Cache-as-RAM mode by disabling cache. */ | ||||
| 	movl	%cr0, %eax | ||||
| 	orl	$(1 << 30), %eax | ||||
| 	movl	%eax, %cr0 | ||||
|  | ||||
| 	/* Enable cache for our code in Flash because we do XIP here */ | ||||
| 	movl	$MTRRphysBase_MSR(1), %ecx | ||||
| 	xorl	%edx, %edx | ||||
| 	/* | ||||
| 	 * IMPORTANT: The following calculation _must_ be done at runtime. See | ||||
| 	 * http://www.coreboot.org/pipermail/coreboot/2010-October/060855.html | ||||
| 	 */ | ||||
| 	movl    $copy_and_run, %eax | ||||
| 	andl    $(~(CONFIG_XIP_ROM_SIZE - 1)), %eax | ||||
| 	orl	$MTRR_TYPE_WRPROT, %eax | ||||
| 	wrmsr | ||||
|  | ||||
| 	movl	$MTRRphysMask_MSR(1), %ecx | ||||
| 	movl	$CPU_PHYSMASK_HI, %edx | ||||
| 	movl	$(~(CONFIG_XIP_ROM_SIZE - 1) | MTRRphysMaskValid), %eax | ||||
| 	wrmsr | ||||
|  | ||||
| 	post_code(0x27) | ||||
| #if CONFIG_CACHE_MRC_BIN | ||||
| 	/* Enable caching for ram init code to run faster */ | ||||
| 	movl	$MTRRphysBase_MSR(2), %ecx | ||||
| 	movl	$(CACHE_MRC_BASE | MTRR_TYPE_WRPROT), %eax | ||||
| 	xorl	%edx, %edx | ||||
| 	wrmsr | ||||
| 	movl	$MTRRphysMask_MSR(2), %ecx | ||||
| 	movl	$(CACHE_MRC_MASK | MTRRphysMaskValid), %eax | ||||
| 	movl	$CPU_PHYSMASK_HI, %edx | ||||
| 	wrmsr | ||||
| #endif | ||||
|  | ||||
| 	post_code(0x28) | ||||
| 	/* Enable cache. */ | ||||
| 	movl	%cr0, %eax | ||||
| 	andl	$(~((1 << 30) | (1 << 29))), %eax | ||||
| 	movl	%eax, %cr0 | ||||
|  | ||||
| 	/* Set up the stack pointer below MRC variable space. */ | ||||
| 	movl	$(CACHE_AS_RAM_SIZE + CACHE_AS_RAM_BASE - \ | ||||
| 		  CONFIG_DCACHE_RAM_MRC_VAR_SIZE - 4), %eax | ||||
| 	movl	%eax, %esp | ||||
|  | ||||
| 	/* Restore the BIST result. */ | ||||
| 	movl	%ebp, %eax | ||||
| 	movl	%esp, %ebp | ||||
| 	pushl	%eax | ||||
|  | ||||
| before_romstage: | ||||
| 	post_code(0x29) | ||||
| 	/* Call romstage.c main function. */ | ||||
| 	call	main | ||||
|  | ||||
| 	post_code(0x2f) | ||||
|  | ||||
| 	/* Copy global variable space (for USBDEBUG) to memory */ | ||||
| #if CONFIG_USBDEBUG | ||||
| 	cld | ||||
| 	movl	$(CONFIG_DCACHE_RAM_BASE + CONFIG_DCACHE_RAM_SIZE - 24), %esi | ||||
| 	movl	$(CONFIG_RAMTOP - 24), %edi | ||||
| 	movl	$24, %ecx | ||||
| 	rep	movsb | ||||
| #endif | ||||
|  | ||||
| 	post_code(0x30) | ||||
|  | ||||
| 	/* Disable cache. */ | ||||
| 	movl	%cr0, %eax | ||||
| 	orl	$(1 << 30), %eax | ||||
| 	movl	%eax, %cr0 | ||||
|  | ||||
| 	post_code(0x31) | ||||
|  | ||||
| 	/* Disable MTRR. */ | ||||
| 	movl	$MTRRdefType_MSR, %ecx | ||||
| 	rdmsr | ||||
| 	andl	$(~MTRRdefTypeEn), %eax | ||||
| 	wrmsr | ||||
|  | ||||
| 	post_code(0x31) | ||||
|  | ||||
| 	/* Disable the no eviction run state */ | ||||
| 	movl    $NoEvictMod_MSR, %ecx | ||||
| 	rdmsr | ||||
| 	andl    $~2, %eax | ||||
| 	wrmsr | ||||
|  | ||||
| 	invd | ||||
|  | ||||
| 	/* Disable the no eviction mode */ | ||||
| 	rdmsr | ||||
| 	andl    $~1, %eax | ||||
| 	wrmsr | ||||
|  | ||||
| #if CONFIG_CACHE_MRC_BIN | ||||
| 	/* Clear MTRR that was used to cache MRC */ | ||||
| 	xorl	%eax, %eax | ||||
| 	xorl	%edx, %edx | ||||
| 	movl	$MTRRphysBase_MSR(2), %ecx | ||||
| 	wrmsr | ||||
| 	movl	$MTRRphysMask_MSR(2), %ecx | ||||
| 	wrmsr | ||||
| #endif | ||||
|  | ||||
| 	post_code(0x33) | ||||
|  | ||||
| 	/* Enable cache. */ | ||||
| 	movl	%cr0, %eax | ||||
| 	andl	$~((1 << 30) | (1 << 29)), %eax | ||||
| 	movl	%eax, %cr0 | ||||
|  | ||||
| 	post_code(0x36) | ||||
|  | ||||
| 	/* Disable cache. */ | ||||
| 	movl	%cr0, %eax | ||||
| 	orl	$(1 << 30), %eax | ||||
| 	movl	%eax, %cr0 | ||||
|  | ||||
| 	post_code(0x38) | ||||
|  | ||||
| 	/* Enable Write Back and Speculative Reads for the first MB | ||||
| 	 * and coreboot_ram. | ||||
| 	 */ | ||||
| 	movl	$MTRRphysBase_MSR(0), %ecx | ||||
| 	movl	$(0x00000000 | MTRR_TYPE_WRBACK), %eax | ||||
| 	xorl	%edx, %edx | ||||
| 	wrmsr | ||||
| 	movl	$MTRRphysMask_MSR(0), %ecx | ||||
| 	movl	$(~(CONFIG_RAMTOP - 1) | MTRRphysMaskValid), %eax | ||||
| 	movl	$CPU_PHYSMASK_HI, %edx	// 36bit address space | ||||
| 	wrmsr | ||||
|  | ||||
| 	/* Enable Caching and speculative Reads for the | ||||
| 	 * complete ROM now that we actually have RAM. | ||||
| 	 */ | ||||
| 	movl	$MTRRphysBase_MSR(1), %ecx | ||||
| 	movl	$(0xffc00000 | MTRR_TYPE_WRPROT), %eax | ||||
| 	xorl	%edx, %edx | ||||
| 	wrmsr | ||||
| 	movl	$MTRRphysMask_MSR(1), %ecx | ||||
| 	movl	$(~(4*1024*1024 - 1) | MTRRphysMaskValid), %eax | ||||
| 	movl	$CPU_PHYSMASK_HI, %edx | ||||
| 	wrmsr | ||||
|  | ||||
| 	post_code(0x39) | ||||
|  | ||||
| 	/* And enable cache again after setting MTRRs. */ | ||||
| 	movl	%cr0, %eax | ||||
| 	andl	$~((1 << 30) | (1 << 29)), %eax | ||||
| 	movl	%eax, %cr0 | ||||
|  | ||||
| 	post_code(0x3a) | ||||
|  | ||||
| 	/* Enable MTRR. */ | ||||
| 	movl	$MTRRdefType_MSR, %ecx | ||||
| 	rdmsr | ||||
| 	orl	$MTRRdefTypeEn, %eax | ||||
| 	wrmsr | ||||
|  | ||||
| 	post_code(0x3b) | ||||
|  | ||||
| 	/* Invalidate the cache again. */ | ||||
| 	invd | ||||
|  | ||||
| 	post_code(0x3c) | ||||
|  | ||||
| #if CONFIG_HAVE_ACPI_RESUME | ||||
| 	movl	CBMEM_BOOT_MODE, %eax | ||||
| 	cmpl	$0x2, %eax // Resume? | ||||
| 	jne	__acpi_resume_backup_done | ||||
|  | ||||
| 	/* copy 1MB - 64K to high tables ram_base to prevent memory corruption | ||||
| 	 * through stage 2. We could keep stuff like stack and heap in high | ||||
| 	 * tables memory completely, but that's a wonderful clean up task for | ||||
| 	 * another day. | ||||
| 	 */ | ||||
| 	cld | ||||
| 	movl	$CONFIG_RAMBASE, %esi | ||||
| 	movl	CBMEM_RESUME_BACKUP, %edi | ||||
| 	movl	$HIGH_MEMORY_SAVE / 4, %ecx | ||||
| 	rep	movsl | ||||
|  | ||||
| __acpi_resume_backup_done: | ||||
| #endif | ||||
|  | ||||
| 	post_code(0x3d) | ||||
|  | ||||
| 	/* Clear boot_complete flag. */ | ||||
| 	xorl	%ebp, %ebp | ||||
| __main: | ||||
| 	post_code(POST_PREPARE_RAMSTAGE) | ||||
| 	cld			/* Clear direction flag. */ | ||||
|  | ||||
| 	movl	%ebp, %esi | ||||
|  | ||||
| 	movl	$ROMSTAGE_STACK, %esp | ||||
| 	movl	%esp, %ebp | ||||
| 	pushl	%esi | ||||
| 	call	copy_and_run | ||||
|  | ||||
| .Lhlt: | ||||
| 	post_code(POST_DEAD_CODE) | ||||
| 	hlt | ||||
| 	jmp	.Lhlt | ||||
|  | ||||
| mtrr_table: | ||||
| 	/* Fixed MTRRs */ | ||||
| 	.word 0x250, 0x258, 0x259 | ||||
| 	.word 0x268, 0x269, 0x26A | ||||
| 	.word 0x26B, 0x26C, 0x26D | ||||
| 	.word 0x26E, 0x26F | ||||
| 	/* Variable MTRRs */ | ||||
| 	.word 0x200, 0x201, 0x202, 0x203 | ||||
| 	.word 0x204, 0x205, 0x206, 0x207 | ||||
| 	.word 0x208, 0x209, 0x20A, 0x20B | ||||
| 	.word 0x20C, 0x20D, 0x20E, 0x20F | ||||
| 	.word 0x210, 0x211, 0x212, 0x213 | ||||
| mtrr_table_end: | ||||
|  | ||||
							
								
								
									
										37
									
								
								src/cpu/intel/model_206ax/chip.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								src/cpu/intel/model_206ax/chip.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,37 @@ | ||||
| /* | ||||
|  * This file is part of the coreboot project. | ||||
|  * | ||||
|  * Copyright (C) 2011 The Chromium OS Authors.  All rights reserved. | ||||
|  * | ||||
|  * This program is free software; you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  * the Free Software Foundation; version 2 of the License. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License | ||||
|  * along with this program; if not, write to the Free Software | ||||
|  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA | ||||
|  */ | ||||
|  | ||||
| extern struct chip_operations cpu_intel_model_206ax_ops; | ||||
|  | ||||
| /* Magic value used to locate this chip in the device tree */ | ||||
| #define SPEEDSTEP_APIC_MAGIC 0xACAC | ||||
|  | ||||
| struct cpu_intel_model_206ax_config { | ||||
| 	u8 disable_acpi;	/* Do not generate CPU ACPI tables */ | ||||
|  | ||||
| 	u8 pstate_coord_type;	/* Processor Coordination Type */ | ||||
|  | ||||
| 	int c1_battery;		/* ACPI C1 on Battery Power */ | ||||
| 	int c2_battery;		/* ACPI C2 on Battery Power */ | ||||
| 	int c3_battery;		/* ACPI C3 on Battery Power */ | ||||
|  | ||||
| 	int c1_acpower;		/* ACPI C1 on AC Power */ | ||||
| 	int c2_acpower;		/* ACPI C2 on AC Power */ | ||||
| 	int c3_acpower;		/* ACPI C3 on AC Power */ | ||||
| }; | ||||
							
								
								
									
										60
									
								
								src/cpu/intel/model_206ax/finalize.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										60
									
								
								src/cpu/intel/model_206ax/finalize.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,60 @@ | ||||
| /* | ||||
|  * This file is part of the coreboot project. | ||||
|  * | ||||
|  * Copyright (C) 2012 The Chromium OS Authors. All rights reserved. | ||||
|  * | ||||
|  * This program is free software; you can redistribute it and/or | ||||
|  * modify it under the terms of the GNU General Public License as | ||||
|  * published by the Free Software Foundation; version 2 of | ||||
|  * the License. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License | ||||
|  * along with this program; if not, write to the Free Software | ||||
|  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA | ||||
|  */ | ||||
|  | ||||
| #include <stdint.h> | ||||
| #include <stdlib.h> | ||||
| #include <cpu/cpu.h> | ||||
| #include <cpu/x86/msr.h> | ||||
| #include "model_206ax.h" | ||||
|  | ||||
| static void msr_set_bit(unsigned reg, unsigned bit) | ||||
| { | ||||
| 	msr_t msr = rdmsr(reg); | ||||
|  | ||||
| 	if (bit < 32) { | ||||
| 		if (msr.lo & (1 << bit)) | ||||
| 			return; | ||||
| 		msr.lo |= 1 << bit; | ||||
| 	} else { | ||||
| 		if (msr.hi & (1 << (bit - 32))) | ||||
| 			return; | ||||
| 		msr.hi |= 1 << (bit - 32); | ||||
| 	} | ||||
|  | ||||
| 	wrmsr(reg, msr); | ||||
| } | ||||
|  | ||||
| void intel_model_206ax_finalize_smm(void) | ||||
| { | ||||
| 	msr_set_bit(IA32_FEATURE_CONTROL, 0); | ||||
| 	msr_set_bit(MSR_PMG_CST_CONFIG_CONTROL, 15); | ||||
|  | ||||
| 	/* Lock AES-NI only if supported */ | ||||
| 	if (cpuid_ecx(1) & (1 << 25)) | ||||
| 		msr_set_bit(MSR_FEATURE_CONFIG, 0); | ||||
|  | ||||
| 	msr_set_bit(MSR_PP0_CURRENT_CONFIG, 31); | ||||
| 	msr_set_bit(MSR_PP1_CURRENT_CONFIG, 31); | ||||
| 	msr_set_bit(MSR_PKG_POWER_LIMIT, 63); | ||||
| 	msr_set_bit(MSR_PP0_POWER_LIMIT, 31); | ||||
| 	msr_set_bit(MSR_PP1_POWER_LIMIT, 31); | ||||
| 	msr_set_bit(MSR_MISC_PWR_MGMT, 22); | ||||
| 	msr_set_bit(MSR_LT_LOCK_MEMORY, 0); | ||||
| } | ||||
							
								
								
									
										611
									
								
								src/cpu/intel/model_206ax/microcode-m12206a7_00000025.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										611
									
								
								src/cpu/intel/model_206ax/microcode-m12206a7_00000025.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,611 @@ | ||||
| //+++ | ||||
| //	Copyright (c) <1995-2011>, Intel Corporation. | ||||
| //	All rights reserved. | ||||
| // | ||||
| //	Redistribution. Redistribution and use in binary form, without modification, are | ||||
| //	permitted provided that the following conditions are met: | ||||
| //		.Redistributions must reproduce the above copyright notice and the following | ||||
| //	disclaimer in the documentation and/or other materials provided with the | ||||
| //	distribution. | ||||
| //		.Neither the name of Intel Corporation nor the names of its suppliers may be used | ||||
| //	to endorse or promote products derived from this software without specific prior | ||||
| //	written permission. | ||||
| //		.No reverse engineering, decompilation, or disassembly of this software is | ||||
| //	permitted. | ||||
| //		."Binary form" includes any format commonly used for electronic conveyance | ||||
| //	which is a reversible, bit-exact translation of binary representation to ASCII or | ||||
| //	ISO text, for example, "uuencode." | ||||
| // | ||||
| //	DISCLAIMER. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT | ||||
| //	HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED | ||||
| //	WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||||
| //	WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR | ||||
| //	PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER | ||||
| //	OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | ||||
| //	SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT | ||||
| //	NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||||
| //	LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | ||||
| //	CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, | ||||
| //	STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||
| //	ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF | ||||
| //	ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
| // | ||||
| //--- | ||||
| /*  Thu Nov 10 10:30:59 CST 2011  */ | ||||
| /*  m12206a7_00000025.inc  */ | ||||
| 0x00000001,	0x00000025,	0x10112011,	0x000206a7, | ||||
| 0x6aa14554,	0x00000001,	0x00000012,	0x000023d0, | ||||
| 0x00002400,	0x00000000,	0x00000000,	0x00000000, | ||||
| 0x00000000,	0x000000a1,	0x00020001,	0x00000025, | ||||
| 0x00000000,	0x00000000,	0x20111011,	0x000008d1, | ||||
| 0x00000001,	0x000206a7,	0x00000000,	0x00000000, | ||||
| 0x00000000,	0x00000000,	0x00000000,	0x00000000, | ||||
| 0x00000000,	0x000008d1,	0x00000000,	0x00000000, | ||||
| 0x00000000,	0x00000000,	0x00000000,	0x00000000, | ||||
| 0x9d225b45,	0x6ab4c3b0,	0xebba1c32,	0x469a230a, | ||||
| 0x8a7d6315,	0x2fc24d3e,	0x82506f79,	0x18dbb9d6, | ||||
| 0x1a7bbeb1,	0x355a1d62,	0x2e7eb594,	0x09f8dea9, | ||||
| 0x432a49e4,	0xbf520253,	0xdafa4010,	0x893a858a, | ||||
| 0x766e0efb,	0xd91e196d,	0x838bd2ef,	0xe5146494, | ||||
| 0xd515f413,	0x29704828,	0xe85598b6,	0xdcbe6c51, | ||||
| 0x88eabbfa,	0xa1e8909f,	0xd8931721,	0x35386554, | ||||
| 0x089a78a7,	0xd9914775,	0xd4644748,	0x1556a4dc, | ||||
| 0xf44448f6,	0xd054d7db,	0xf30f2b7d,	0x5ae223d0, | ||||
| 0xcbbb48b0,	0x5c8b0383,	0x177de157,	0x9c1e5f73, | ||||
| 0x2ec28289,	0xd72a7b6c,	0x823b6eb2,	0x35e02171, | ||||
| 0xba8deae4,	0x06f4d468,	0x13dbafaa,	0x72b419f1, | ||||
| 0x033385b5,	0x05806920,	0x4c6034cf,	0x9bd117dc, | ||||
| 0x976e2d04,	0x250330f0,	0x7250b5e1,	0x184980c2, | ||||
| 0x12a9d7d6,	0x1bc808f9,	0xae79994f,	0xc6f87901, | ||||
| 0xc0e3132f,	0x671491c5,	0x236cad39,	0x37889d9c, | ||||
| 0x67f7c3f3,	0x964a6be5,	0xbcced7da,	0x57eeaa6e, | ||||
| 0x7bca1522,	0x654fee4c,	0x2a1ca5d9,	0xa1803cf3, | ||||
| 0x00000011,	0x3f96e33b,	0xbcc97e7d,	0xfecb5781, | ||||
| 0x24a87ac3,	0x281fad3d,	0x6c5d0169,	0x406f3d4b, | ||||
| 0x1bedf9bf,	0x514f3332,	0xb33e1926,	0x539139d4, | ||||
| 0x0b5a03bb,	0x7948224c,	0x403919aa,	0xd30c64b2, | ||||
| 0xb1df420a,	0xbc62cb65,	0x8b036cd8,	0x662064a0, | ||||
| 0x7381ae61,	0xfb070274,	0x9a3978d9,	0x051c1cbd, | ||||
| 0x7bcfb857,	0x2c94fcc0,	0x25f643f1,	0xda3d4463, | ||||
| 0x8aad6318,	0xabd2966c,	0x663d015a,	0x9fe4c504, | ||||
| 0x43786fce,	0xa1b3dfdc,	0x435783a4,	0x1e44e90a, | ||||
| 0x85ae6018,	0x9402a6c9,	0x709f4d13,	0x1bdec841, | ||||
| 0x4840a539,	0xaa446221,	0x27401d2d,	0x1e0d39c6, | ||||
| 0x6ae8973f,	0xc8b603b8,	0x8044340d,	0x9a4846e1, | ||||
| 0xf7e68ad9,	0xd2a0cbd1,	0xc64bf2bf,	0x51286697, | ||||
| 0xf3110b6f,	0x1562e9dc,	0xc682712e,	0x5cfbda8f, | ||||
| 0x0d575c4f,	0x929f8530,	0x69abd158,	0x41c783e1, | ||||
| 0xbfe313de,	0x33cbec29,	0xbcbddb8a,	0xe0861b12, | ||||
| 0x866f3884,	0xf3b79ad6,	0x3415ad37,	0x3a17893c, | ||||
| 0xb29694df,	0xecd242ce,	0x5d8231ef,	0x5b208f8f, | ||||
| 0xc781cb94,	0xeb8dc8b8,	0x9d04fd73,	0x4639b3f9, | ||||
| 0x543fbc28,	0x3957879c,	0xc7f0d4a1,	0x29ac4965, | ||||
| 0x10f47a96,	0xf7d5b5ce,	0x8ed0c39f,	0x5a36d20f, | ||||
| 0xff5bd157,	0xf4a3152e,	0xfa9087b4,	0xe4021354, | ||||
| 0x2b394395,	0x118d8abd,	0xa6ef26da,	0xe47688e5, | ||||
| 0x15352ccd,	0xa2a1120c,	0xf86a3b13,	0x3453d233, | ||||
| 0x74d464e9,	0x28cb0910,	0x1c0d9908,	0xf7a672c4, | ||||
| 0xa725013d,	0xfd618f4a,	0x2035f826,	0x2544d00b, | ||||
| 0xe6bd2f30,	0xd6e3992f,	0xf7f39f5e,	0x282a3593, | ||||
| 0x00de27bf,	0x5d0470c2,	0x14473c88,	0xc763ad23, | ||||
| 0x2ccd5c60,	0x71f0d333,	0x09e8b8cd,	0x716fd1e1, | ||||
| 0x2dfd1003,	0x006b819f,	0x7b157ad2,	0xa6305470, | ||||
| 0xcde50f1a,	0x955bc9c8,	0xbe464835,	0xf67f9b33, | ||||
| 0x21ab56ea,	0xc133d4c6,	0x77d754bf,	0x130877e0, | ||||
| 0xbd1b247a,	0x7840690d,	0xe6174dd0,	0x61d13bfd, | ||||
| 0x675ae943,	0x9149e21b,	0xce8ddf65,	0xe06ca163, | ||||
| 0x33ee3750,	0xa89318e4,	0xa5476a0f,	0x72d15429, | ||||
| 0x1442d6e5,	0x13f70d65,	0x81923d22,	0x4eefbbc5, | ||||
| 0x1af2cbf1,	0x052ae881,	0x2fcb621a,	0x44e6c1f6, | ||||
| 0x10c0c127,	0x6132dbfc,	0x0b3e5d38,	0x18379c7c, | ||||
| 0x24848ccf,	0xb929cddf,	0xbd0c9549,	0x68d44ac1, | ||||
| 0xf1a4967b,	0x60d466f9,	0x60a12700,	0x6bdf875f, | ||||
| 0x2d8255a9,	0x464c149d,	0x32c047ee,	0x5d744d6c, | ||||
| 0xdf44c2b2,	0xda41f152,	0xb83bd853,	0x3f612ed9, | ||||
| 0xcecd3f95,	0xde938fc5,	0x2120712d,	0x6e895650, | ||||
| 0xa5d34947,	0xb5d7459d,	0x13df64d9,	0xf8d40e55, | ||||
| 0x7f590e01,	0x1724e7cf,	0x5843ee08,	0xdce43dd9, | ||||
| 0x574cae1c,	0x5ec349e6,	0x56ab1066,	0x7d518ee9, | ||||
| 0x1f83b1fe,	0xac633b58,	0xcef8a5fd,	0xacf35357, | ||||
| 0xa93932b1,	0x64e73ca0,	0xb824e2b0,	0xb6c68da4, | ||||
| 0x287ee847,	0xec1dbf97,	0xd313d2fa,	0x9fe37eec, | ||||
| 0x281d8559,	0x2fd0c6c7,	0x15e9a89a,	0x273e9932, | ||||
| 0xf081dec8,	0xa04d5e16,	0x8a3ac66a,	0xe5b25b5c, | ||||
| 0x4138b7b3,	0xace013c4,	0xe5bee1c8,	0xd9daafd4, | ||||
| 0x952af837,	0xf28c36bf,	0xcdff2a71,	0xa1cf3b94, | ||||
| 0x8821440c,	0x3693fab8,	0xd6d2d0d0,	0xa2ccd66d, | ||||
| 0xe8736467,	0x8a8952f8,	0xe32db4d9,	0x47b71bdf, | ||||
| 0x620f3c22,	0xdb2922a7,	0x98e5cc6b,	0x905be886, | ||||
| 0x822feb82,	0xf722cf0c,	0x7a356d80,	0x9c6b3ab6, | ||||
| 0x19a3cc17,	0x08dfaf09,	0x4c99a23d,	0x0926d99e, | ||||
| 0xa81577e5,	0xc684495a,	0x359aa743,	0xbc7aa166, | ||||
| 0xaac2e24d,	0x16110785,	0x8ccc6fbc,	0xfd90cf70, | ||||
| 0xb34be19c,	0xf57fef0d,	0x9c29c8a7,	0x022c249d, | ||||
| 0x946cef68,	0xe07b7779,	0x4f6ea6b4,	0xe3a4eef4, | ||||
| 0xfed31061,	0x96e78ae9,	0x220c0f91,	0x30aca707, | ||||
| 0xa081c7b9,	0x159dc936,	0x4cbaa290,	0x447910e2, | ||||
| 0x6ec95f93,	0x3cc3fde8,	0xce2c17a1,	0x4f18c4cb, | ||||
| 0x025605b1,	0xbce02471,	0x21656693,	0x9368f6cd, | ||||
| 0x0c19760f,	0xcc35da81,	0x4c5edab1,	0x85a0890e, | ||||
| 0xbc5b861e,	0x203a23a6,	0xddc7d7ed,	0x0b585825, | ||||
| 0xec9e7ab2,	0x1f1ad49a,	0xa7444b1f,	0xe77976b4, | ||||
| 0x99e8c05e,	0x8b04c7c2,	0xb1aeb88b,	0x416d07ac, | ||||
| 0x5a5689be,	0xe4094686,	0xe048c8e6,	0x2e0259dd, | ||||
| 0xd2fe1113,	0x6190504b,	0xa0352318,	0x6f0cae7c, | ||||
| 0x040da641,	0x29fab483,	0x2e354a07,	0xab62c485, | ||||
| 0xbd787e0a,	0xc345308c,	0xc8ab8568,	0xf75adc1d, | ||||
| 0x82b55654,	0x6cf29bbf,	0x8786a46e,	0x433c20d2, | ||||
| 0x9229c1ee,	0x5e8eedf5,	0xab9bb981,	0x1a1a5419, | ||||
| 0x97994816,	0x010eef10,	0x0172fd65,	0x975b8297, | ||||
| 0xff6c4377,	0x6fca39f8,	0x13accf88,	0x94f05a02, | ||||
| 0x5a772f20,	0xfbf97bca,	0x60801139,	0x64cbd0a6, | ||||
| 0x72512821,	0x0830cb9a,	0x402f033c,	0xd0e2a50d, | ||||
| 0x7ac45ee3,	0xbae23515,	0xd213695d,	0x72016572, | ||||
| 0x20651143,	0x3552bc4d,	0xf014ebb1,	0x9aeebedf, | ||||
| 0xee65d90f,	0x53abd424,	0x841f5383,	0xa43a2e44, | ||||
| 0xee379480,	0x1638e568,	0x2573aad0,	0x2e935090, | ||||
| 0xb9dcbe13,	0x9cdc4e30,	0xce8d170c,	0xbc546d14, | ||||
| 0x18b77a7b,	0x3b652642,	0x79ae26c2,	0x5ab240c2, | ||||
| 0xf74cfe35,	0x30be64cf,	0x3b5e7456,	0x81be84d1, | ||||
| 0x12bb10db,	0x573da6b3,	0x83e28efe,	0x395c1512, | ||||
| 0xf11928ee,	0xe64d50b5,	0x6f714c8b,	0xb3393f61, | ||||
| 0x13b6b2f4,	0x0ab3b2aa,	0x5cada4c7,	0x19dfb423, | ||||
| 0xe7b1c195,	0x47ee32d7,	0x03ab86bd,	0x08b8a8c6, | ||||
| 0xdc7a6cdf,	0x3e5b4f68,	0x9ea0e297,	0x13193f7e, | ||||
| 0x8fe31f30,	0x6118a11c,	0xc0762196,	0x9fd26fc0, | ||||
| 0x9f515662,	0x5a1abb55,	0x5e434855,	0x4c6af26a, | ||||
| 0x163cf95d,	0xa54ee076,	0xb41a0c1a,	0xf8a8affb, | ||||
| 0x69db8391,	0xa7204db3,	0x86dc9909,	0x25ba82c5, | ||||
| 0x04154f7a,	0xa191c23a,	0x6f3ee8ed,	0x55162d2b, | ||||
| 0x14f9478d,	0xc717fb1c,	0x91408cdd,	0x7a87a50d, | ||||
| 0x44d10ceb,	0xd04b5347,	0x82a3b3ce,	0x07e3998e, | ||||
| 0x1dafee6f,	0x77c24219,	0x4ff885ef,	0xd994194a, | ||||
| 0xfeff078a,	0x20f4b18a,	0x529676bd,	0x17738de7, | ||||
| 0x01f8491b,	0xe31d2728,	0x34e5155b,	0x87120d79, | ||||
| 0xb96f615c,	0xd6d15cd2,	0x4a1f66a8,	0xa0b37474, | ||||
| 0x0713a36e,	0x70df574c,	0xe6015de6,	0x5f50f282, | ||||
| 0xbd828397,	0xda75bb9f,	0x13e35581,	0x5bb84a7f, | ||||
| 0xf66216ca,	0xac35d098,	0xff3a8f78,	0xb43a2d55, | ||||
| 0xcb820994,	0x74f97ab1,	0x0ebb37aa,	0x5457d670, | ||||
| 0xc7617908,	0x5f0ad21e,	0xeb8a4b9f,	0x0c678bc7, | ||||
| 0x705cb6ce,	0xc2b3ef2a,	0x89c0c723,	0xab4399a9, | ||||
| 0xc2216b3e,	0x9adda9ee,	0x82c7bfa0,	0x9d56f661, | ||||
| 0x0f715ee5,	0x627d8182,	0x306a00b9,	0x2d9c259c, | ||||
| 0x251b933c,	0x67fbe9e7,	0x103e2322,	0x29d1c68a, | ||||
| 0x8f019d2f,	0x077e80b4,	0xbbbd9c2a,	0x266f4f74, | ||||
| 0x96b32213,	0x5019c61d,	0x4a59782c,	0x8810efb7, | ||||
| 0xfa55eaae,	0xbabe0b82,	0x956cae7f,	0xf016453c, | ||||
| 0x255e2b2a,	0x1b805b17,	0x9c9b51cb,	0x0eaafa33, | ||||
| 0x45fb3835,	0x2c2070d2,	0x70005da8,	0xf39c43b4, | ||||
| 0x78c372ac,	0xa6fe8b80,	0x473ab824,	0x758cf1c0, | ||||
| 0x8d012210,	0x8e26dc51,	0xf8f88450,	0xd1ffe2b8, | ||||
| 0xa36a40ff,	0xbed11609,	0xaaa32039,	0xbc6ee3b5, | ||||
| 0x36f84b62,	0xbacf3880,	0x26af8917,	0x9c6cb47f, | ||||
| 0xa2a70b0b,	0x4b003af3,	0x83d9d354,	0x7aa355ce, | ||||
| 0x75ec5db9,	0xa4384855,	0x0e8ac979,	0xa55a370e, | ||||
| 0xbb3af0dd,	0x42153802,	0x32531de8,	0xe57570a8, | ||||
| 0xe490a98c,	0xa9a910ee,	0x453953a6,	0x1348535e, | ||||
| 0xb73595c5,	0x89bcd5dd,	0x0c68cc61,	0x5e880831, | ||||
| 0x65cf0e50,	0xa4ccd3ac,	0xe61f9f5f,	0x01b610b0, | ||||
| 0x7387c5aa,	0x6458654f,	0x35bbb16c,	0x90e9e91c, | ||||
| 0xc56957f2,	0xaadb7f70,	0x07732d08,	0xce4ad932, | ||||
| 0x7fa3e135,	0x31a83cad,	0x43271bcf,	0xa74b4eab, | ||||
| 0x4f483674,	0x9cc84d3c,	0x7562feb5,	0x0b445b18, | ||||
| 0xc1b1b769,	0xcfd31f23,	0xdf6f0843,	0x56789e7b, | ||||
| 0x0ed7daf8,	0xe28e3610,	0x0b516cac,	0x5d805128, | ||||
| 0xe430861d,	0x993bc596,	0xd85434cb,	0x740f7d13, | ||||
| 0xe91e0d47,	0xe518a80f,	0xf729e13a,	0xd7fde910, | ||||
| 0x838697c0,	0xf25c49b6,	0x7b9a6956,	0x70c8cb88, | ||||
| 0xe5befc43,	0x84e0cd72,	0x2799a866,	0x62f8241e, | ||||
| 0xa13dd267,	0x675404c0,	0x107995e6,	0xd5a44abb, | ||||
| 0xe8b14bc2,	0x299705c4,	0xe691d679,	0x2a72edfa, | ||||
| 0x353adfa6,	0x89aa4a58,	0x22247d90,	0x5a97fc14, | ||||
| 0x09843de7,	0x4537f188,	0x7cd7cb9c,	0x7395900f, | ||||
| 0xa178c352,	0x96fff660,	0x3b1d36a9,	0x7872cd2c, | ||||
| 0x4e8e86ac,	0x6d0d129e,	0x366d1810,	0x84e4869f, | ||||
| 0x9d73317d,	0xfc92685c,	0x6b3ba9cf,	0x573d9a1f, | ||||
| 0xa5e5a1bd,	0x29620cbd,	0xd7a53209,	0x156f5151, | ||||
| 0x58a48a3b,	0x91e00b57,	0xf68f1270,	0xb0911b95, | ||||
| 0xf33c953b,	0x7402498a,	0x7cd9d9b5,	0x7f306060, | ||||
| 0x08de3b88,	0x4e1b3dfa,	0xb7f0044f,	0x1e215ef7, | ||||
| 0xaa6a9016,	0xdc45a3f7,	0x6a5266f9,	0x44f25fa1, | ||||
| 0x64d10347,	0xf518fca6,	0x0043e846,	0x9f768875, | ||||
| 0x2338de08,	0xecb485e7,	0xe53abf19,	0xdb887ab5, | ||||
| 0xb61c7a2e,	0x33ff900b,	0xf8323567,	0x34eaf959, | ||||
| 0x861b3ee3,	0xb416d9a8,	0x38073e63,	0x2f05c10f, | ||||
| 0x84159c49,	0xaeb0462f,	0x82c74fd4,	0x471c5d20, | ||||
| 0x6c6b77b9,	0xd9e07c77,	0xe49a020b,	0x9b15469b, | ||||
| 0x53a1dd1d,	0xf372f68c,	0xc42b3729,	0xee64f017, | ||||
| 0x06969bc7,	0xbc538ee3,	0xec79f4dd,	0xa948e000, | ||||
| 0x77e45852,	0xeba3a61e,	0x21d74dc6,	0x62c47642, | ||||
| 0xa12854b5,	0x10359530,	0x181703f1,	0xae4b7bf7, | ||||
| 0x567633f7,	0x585012e9,	0x74e8837e,	0xf6750d5c, | ||||
| 0x31edb0be,	0xa1fbe771,	0x1414bb70,	0x5f451222, | ||||
| 0x56b71fa1,	0x42fe4e54,	0xaafb543f,	0x8e861547, | ||||
| 0x8281a64c,	0x9f316107,	0x156bd5db,	0xd6b8e0e9, | ||||
| 0x419fe658,	0x6897a516,	0x98d60208,	0xbbf31e8a, | ||||
| 0x82e78e6f,	0xbb08b49a,	0x5b5fdeb5,	0xb3a9e8da, | ||||
| 0xbfc6b353,	0xfbcdcf56,	0x20732e73,	0x8026f595, | ||||
| 0x99cabead,	0xa831e2aa,	0x6a70356d,	0xa1566f0c, | ||||
| 0x2340d50a,	0xd9e99b6f,	0xddd31fec,	0x79479c00, | ||||
| 0x66c993e9,	0x3e5a6bbb,	0xc973c063,	0xcaf97f9a, | ||||
| 0x94726d54,	0x367a657d,	0x084244e0,	0xea281246, | ||||
| 0x8deca641,	0xca9812de,	0x9e6c0227,	0x6572f207, | ||||
| 0x3d9282ad,	0x9a5888f8,	0x437fb2f2,	0xa59fd791, | ||||
| 0xf46fad2f,	0x91b04878,	0xdbe527b9,	0xddf11081, | ||||
| 0xfe7aab5d,	0x535d00d2,	0x6281997a,	0xbdf3a7fb, | ||||
| 0x2b00033a,	0xfa6eee8c,	0xdf2ddf1c,	0x67a47291, | ||||
| 0x5fcc2258,	0x9718099f,	0xb667495e,	0x154f12da, | ||||
| 0xcade895c,	0x3c5a8529,	0x06727bf8,	0x28ece4f9, | ||||
| 0x881481f3,	0xa5299ac6,	0x7602f0ed,	0x9cc90020, | ||||
| 0x0e6e42bc,	0x749c85a6,	0x8fff0e9f,	0x75e4e9a4, | ||||
| 0xd7d1b424,	0xec83f7d6,	0x229a883e,	0x35790b38, | ||||
| 0x7f973e98,	0x1198edd9,	0x15349ffa,	0x3a5224ad, | ||||
| 0x135f46e2,	0xa62b3da4,	0x3924c952,	0xcf193aed, | ||||
| 0x1de1ce38,	0x57d72478,	0x605c1961,	0x45f76230, | ||||
| 0x55f8d7b8,	0xe26499d8,	0xd214b4b8,	0xa9939f45, | ||||
| 0x36610bd1,	0x65a3d400,	0xce82c54b,	0x2e4d3e01, | ||||
| 0x07fdb9ec,	0xda246930,	0x6dcf119a,	0x80904d6c, | ||||
| 0xe4950422,	0xe5e8bee8,	0x19e9d0d5,	0xacecf91b, | ||||
| 0x0f4edefe,	0xc1d98382,	0x7e22975d,	0x3cc17318, | ||||
| 0x036df2e6,	0x8811ba2d,	0xf9a75154,	0xeb65faa4, | ||||
| 0xad7b4294,	0xae8be741,	0x23009705,	0xc3ec4131, | ||||
| 0xf1257f3a,	0x7472f715,	0x6e6a9a61,	0x4f54f585, | ||||
| 0xdc200841,	0x05164b24,	0x633b0c72,	0x7abd83a7, | ||||
| 0xc32b4865,	0x7fafd317,	0x835395a1,	0xa1989b58, | ||||
| 0x3638fae8,	0xcfcb3e12,	0x8370e894,	0x39ff005a, | ||||
| 0xb61a1923,	0x047e0336,	0x5a7e61bb,	0x79bf462e, | ||||
| 0xb978d8e2,	0x61036c49,	0xc4590141,	0x6a1b3cc8, | ||||
| 0xef911d1f,	0x037c8e5e,	0x5e03ff55,	0x1d987d84, | ||||
| 0x577afd01,	0xca680678,	0xef93d41f,	0x7eb7a00d, | ||||
| 0x24b96544,	0xcae6dc5c,	0x13880a0c,	0x1931eb40, | ||||
| 0x120bb052,	0x9d29c0d5,	0xe8508f3e,	0x48f79aa3, | ||||
| 0x620c6e62,	0xe8a32b41,	0x9ef5f0cd,	0x734ccfe1, | ||||
| 0xe373ddfd,	0xa58f816a,	0xbf0a8320,	0xdc9eb021, | ||||
| 0x8d111767,	0xb63f07af,	0x34a49062,	0xc766e22e, | ||||
| 0x7b858a87,	0xe30429f2,	0xb9d6e6d2,	0x2a5a0a5c, | ||||
| 0xa69fcc61,	0xeabc878b,	0xa1bd76a3,	0xc1e7ad18, | ||||
| 0xcdbb6778,	0x26f9f4cb,	0x5c5eb98e,	0x68595618, | ||||
| 0x18980a09,	0x3f2fd59f,	0xc190c9e6,	0xbf9feb9b, | ||||
| 0x82904bda,	0xd8caf976,	0x17759190,	0x0e3584d7, | ||||
| 0xaae29da2,	0x5af72bb9,	0x10032dfb,	0x78fb8c42, | ||||
| 0xb883ecb2,	0x023b5f8a,	0x29c8fac5,	0x6c0fd4dc, | ||||
| 0x566ad781,	0x7c467064,	0x40b04bd0,	0x17483069, | ||||
| 0x4edb6951,	0x722e9b73,	0x6b3aa8fa,	0x6102de88, | ||||
| 0xf329cc45,	0xb9d9e5c6,	0xfdd1b48a,	0x7bee844f, | ||||
| 0xdaa5ba6e,	0x1a77be4e,	0xf3fff7e4,	0x77f23560, | ||||
| 0x52ec1835,	0x5a3309e6,	0x66e57a4f,	0x2e09d3f9, | ||||
| 0x06c8dc63,	0x41cdbae8,	0x0471a391,	0x08f42ae2, | ||||
| 0xd210e0d5,	0xffb0605d,	0x2bbc723b,	0x9bb7ebac, | ||||
| 0xc8b1514e,	0x988de7d9,	0x3fe2681f,	0x25d50d87, | ||||
| 0x75ef655e,	0xe4b6ee36,	0x534d0ed7,	0x09bbabc5, | ||||
| 0x8c98d8c1,	0xda844b84,	0xe4cc19c5,	0xa337404b, | ||||
| 0x2a0274f1,	0xbd2efe16,	0x7da6a62e,	0x2ac77399, | ||||
| 0xb3354115,	0x147f564d,	0x53e0081c,	0x5879feab, | ||||
| 0x6677eb78,	0x7a092b8d,	0xe4767106,	0x2522d836, | ||||
| 0xe41a4856,	0x44375433,	0x03e50549,	0x82a25e07, | ||||
| 0x600fc53a,	0xe9df6e40,	0x270a0e39,	0x99f3c993, | ||||
| 0xdf81fa72,	0x4ebfc21d,	0xca53b339,	0x774df819, | ||||
| 0xa91d2d62,	0xfeb422a7,	0x5441fa53,	0x5b233223, | ||||
| 0xa804fafb,	0xbd45f42a,	0x4c5e0f6b,	0xe24ef499, | ||||
| 0x4910fcd6,	0xadd7dafb,	0x2fd61693,	0x4472656d, | ||||
| 0xa2764e29,	0x7d599640,	0xeb70907c,	0x4a649bcc, | ||||
| 0xdfc05c3f,	0xeaef2ec4,	0xf6e1145e,	0x37bcc4e4, | ||||
| 0xa53dba9e,	0xf03cc163,	0xc13c6931,	0x2edc20df, | ||||
| 0x078d54b7,	0xee035c4b,	0x76101348,	0x72f252c9, | ||||
| 0x98f1e252,	0x14daa04f,	0xed8ffea5,	0x3d2dab6b, | ||||
| 0x44e76b29,	0xcdcd35ea,	0xfdb49b6c,	0x03f54f94, | ||||
| 0x2b45bc9b,	0x1f13d589,	0x6695eb7f,	0xba389af8, | ||||
| 0x9d3a77e6,	0x85b5d65f,	0x8bb17ab8,	0xdb6c6029, | ||||
| 0xbec995d1,	0xbee54aa1,	0x5ea9416c,	0x8ef97a5e, | ||||
| 0x704b8d5c,	0xcdc04d02,	0x9c6c5475,	0x4b296402, | ||||
| 0x47387a84,	0x75d7d716,	0x7fabb8c9,	0xfe635111, | ||||
| 0xb87ba47b,	0xe1c1fd1b,	0x5318691c,	0x0f4ea1d0, | ||||
| 0xbc473b01,	0x0fa27fb4,	0x87dfe823,	0xc0b25fc7, | ||||
| 0xef102726,	0x85246ca6,	0x82530da1,	0x6e520f56, | ||||
| 0x6dad6256,	0x6d085c80,	0x06d4db1a,	0x9b346bf6, | ||||
| 0x0de7db35,	0x7f20a08b,	0xbc587ca1,	0xb87be5ce, | ||||
| 0x792d1d77,	0xd170de23,	0xa84917cd,	0xa508a09f, | ||||
| 0x80c3fb3d,	0xdce4c70c,	0xd8803517,	0xb29e7dfb, | ||||
| 0x922b4c99,	0xbcac718b,	0x2c3c2933,	0x21286fbe, | ||||
| 0xf323b403,	0xc4d0fde9,	0xca754bcf,	0x4f87cb96, | ||||
| 0xef6ef20d,	0xfdcc7cc1,	0x25c910ed,	0x3cc3835e, | ||||
| 0xbf490f6c,	0x5c38abf6,	0x1ed9ac16,	0x06d77efd, | ||||
| 0xf36d3abf,	0x812c8c7e,	0xa6adf73d,	0xcfcb345a, | ||||
| 0xedb6a82f,	0x47132156,	0x810b50c1,	0xd75fa9e8, | ||||
| 0xa11e5166,	0x25ca93a2,	0x3f5c3d5c,	0xc35f5289, | ||||
| 0x32b5a15b,	0x5a5c99b2,	0xe8a5efb9,	0x6a764bc5, | ||||
| 0xc841c2b3,	0xfcbcacfc,	0x8bb897f8,	0xa3651805, | ||||
| 0x9bb91956,	0xc0262cbb,	0x693c8072,	0xcb6bd69f, | ||||
| 0xcf9ff920,	0xd550b6e0,	0x95602c8f,	0x444f40c7, | ||||
| 0x894d4cd0,	0x0010e65d,	0x6705fd32,	0x9b9c1c49, | ||||
| 0x89447cd9,	0x791d1c5e,	0x3545f4eb,	0xbd708c36, | ||||
| 0x54d4ec1f,	0x8e8c7541,	0x0befc0bb,	0x604b32b1, | ||||
| 0x472242d0,	0xee64a895,	0x1aa38ffb,	0x58129ee0, | ||||
| 0xca4f73f8,	0x402508a0,	0x9e47bdc7,	0x68f66e41, | ||||
| 0xd21fc596,	0x22c6ad97,	0x895b94dd,	0xa2504849, | ||||
| 0xa2e93280,	0xdb8b1017,	0x3d5c2f41,	0xa1141892, | ||||
| 0x1bc6761f,	0xddd38e05,	0x6765e5fc,	0xdaf73d22, | ||||
| 0xefea8b26,	0x072db03e,	0x206395f6,	0xd1f157cc, | ||||
| 0x48076326,	0x96cc1c9e,	0x5d22a18e,	0xe09876c9, | ||||
| 0x49735852,	0x2d22596d,	0x83fbd660,	0xad07c37b, | ||||
| 0xa7eb7c8f,	0x8749415b,	0x4e2fb8ad,	0xfd14301e, | ||||
| 0x2f34bf4c,	0x0897e405,	0xdd1674fb,	0x3fbbcb6c, | ||||
| 0xce64eb32,	0x635f92ee,	0x0703710a,	0x8f5bbb08, | ||||
| 0x44d53fea,	0x4031aeaa,	0x6c8e46b0,	0x3ef83794, | ||||
| 0xf1a53b71,	0xf9fa63ac,	0x7eee8f50,	0x372a2115, | ||||
| 0xbf5778e4,	0x9a0fa641,	0x7ce02977,	0x543b876e, | ||||
| 0xcdc95e5e,	0xc2b9bbe0,	0x1ce9b510,	0x53e6085a, | ||||
| 0xf5a1687c,	0x5a081846,	0x2e75f4e8,	0x59435753, | ||||
| 0x3b1b421a,	0x181d1935,	0x80d07eeb,	0xbbf10c83, | ||||
| 0x7dab3f14,	0xb00d2bf6,	0x0f118041,	0xc36373ce, | ||||
| 0x8a9727da,	0x0694ab19,	0x406262c9,	0x7d03dc82, | ||||
| 0xd381fc9d,	0x8b0a38a0,	0xd02ca17b,	0xd5f1b2e4, | ||||
| 0xa3073d25,	0xf7bc4bb9,	0x71d3bcfd,	0x4b581f61, | ||||
| 0x8b73ebcc,	0x59e0c26a,	0xdb93fe79,	0x3cbd90ba, | ||||
| 0x69914b97,	0xd3165a59,	0xd56f756e,	0xa73ecf33, | ||||
| 0xb1e27146,	0xb6869cdb,	0xd1535149,	0x1abbd8cf, | ||||
| 0xafab3059,	0x75802fb5,	0x9e306c2d,	0x70775bb3, | ||||
| 0xeb61fefb,	0x06417435,	0x3b0677c9,	0x2052b076, | ||||
| 0x3ddafb36,	0x768e1e6c,	0x9fcb0e24,	0x8c48bbb0, | ||||
| 0x325b3d6e,	0x71d22a1c,	0x82a4b55f,	0x9991b978, | ||||
| 0xf6395a90,	0xcef98150,	0x34bf6ba8,	0x025faf6c, | ||||
| 0x16e1532f,	0x0bcbb9be,	0xb538e854,	0x50a44c93, | ||||
| 0xf3bb28e8,	0xc7a58580,	0x1d0c37bc,	0x537e7a40, | ||||
| 0x87ae36f9,	0xefe50765,	0x91d4e689,	0x9feea767, | ||||
| 0x40633598,	0xd73d5f27,	0xb9b3dfb6,	0x871e45d5, | ||||
| 0xf14b7246,	0x7e30ec5f,	0xcca72651,	0x5bf4bec9, | ||||
| 0x1febf9b2,	0xd3c0cc4d,	0x7011372c,	0xe43c14c4, | ||||
| 0x383a72c5,	0x0d0ad12d,	0x10351ed2,	0xed4d4eed, | ||||
| 0xf6ce5995,	0xf8013eb7,	0x797e2a3a,	0x50bfb3eb, | ||||
| 0x21a827f9,	0xe57f0f1c,	0x5ad1f4f7,	0x94c96972, | ||||
| 0x31fd2341,	0x5c3fdc9f,	0xc9977254,	0x4ff165c9, | ||||
| 0x3f2fe417,	0x6ea43e26,	0x3ebb9fb6,	0x1bc55753, | ||||
| 0x70c99c08,	0xc39c0026,	0x537681b9,	0x208c21cd, | ||||
| 0x0c7a5403,	0x597efcef,	0x6be988ec,	0x218165ee, | ||||
| 0x844795ec,	0x7628644a,	0xdca723b8,	0xece99c20, | ||||
| 0xf0cf60a0,	0x530f93a6,	0x09d5e5b7,	0xb7374d5a, | ||||
| 0x6c48408f,	0x1f538e31,	0x60992c0a,	0xaf459405, | ||||
| 0xcc41703b,	0x60e58f6d,	0x9490284a,	0xf17ae982, | ||||
| 0x3d95264d,	0xc8392eb8,	0xab992abc,	0x1e7895e4, | ||||
| 0xe8488196,	0x332ecbb8,	0x218fc7f6,	0xe98dfb71, | ||||
| 0x77d7e6e5,	0xfe1fba07,	0x2542bb6f,	0x934e60ff, | ||||
| 0xe0e829e9,	0x1c00b6b9,	0x85395a25,	0x69daf035, | ||||
| 0x30abc36a,	0x66dd22b7,	0x6245306a,	0xaddde5c0, | ||||
| 0x4e04dbd0,	0xbb5a030c,	0xa5cca2d3,	0xa2e74827, | ||||
| 0x5895a5d5,	0xa469ec03,	0x952dbea9,	0x10945bfc, | ||||
| 0xadded5ea,	0x0819a75f,	0x98b50299,	0x6db9ac1f, | ||||
| 0x8ec51f0f,	0x9876b3e0,	0xa604a743,	0xc4daa955, | ||||
| 0x0ce72bbe,	0x3d45ccdb,	0x266e63c3,	0x9a6e65ef, | ||||
| 0xad49601a,	0xaefbba48,	0x684ae417,	0x7eb5d504, | ||||
| 0xdb3b476d,	0x935a21cd,	0xca75a938,	0xc9b5db9f, | ||||
| 0xbff1d079,	0x672f54b5,	0xb06203d6,	0x5a8c1c73, | ||||
| 0xc7baad2a,	0x241cdc99,	0xacba90b9,	0x9ebf8815, | ||||
| 0x00bc590e,	0xd0ca284f,	0x6ef95529,	0xa3f8fade, | ||||
| 0xa8730db1,	0xa8daf232,	0xf83dbbc1,	0xe92365fd, | ||||
| 0x7de3f217,	0xd8fcfe30,	0x5477e0ae,	0x113c2c12, | ||||
| 0x42670906,	0x6e1c5e37,	0x53704757,	0x212a922a, | ||||
| 0x80446b4b,	0xac1e5158,	0x3d5138f7,	0x531ea8ad, | ||||
| 0x9c750cca,	0x72aa6f97,	0x0c25e215,	0x852d7a37, | ||||
| 0xd0d8f8ff,	0x3ace7b86,	0x1535e3bb,	0x216a5a59, | ||||
| 0xb5cd6f41,	0x734d63a8,	0x9454799c,	0xd4fad0e2, | ||||
| 0x73669742,	0xfe67a49d,	0xc55c7355,	0x08c4e57e, | ||||
| 0xef962f80,	0x9664274e,	0xd349ab2e,	0x67961ba0, | ||||
| 0x63dc0bc9,	0x46a1ae19,	0x08e1627e,	0x7d6ca569, | ||||
| 0x101c5ea2,	0xdab84bbb,	0x2dc55a75,	0xcd49a33a, | ||||
| 0x848200de,	0xa9d13dd1,	0xbeb93d9e,	0xb11aaa1c, | ||||
| 0xb8d2d50c,	0xb56a384a,	0x62913304,	0x273503f6, | ||||
| 0xce3b70e9,	0x2d792155,	0x395f4fa4,	0xd285d394, | ||||
| 0x04119784,	0xd311691d,	0x176a6f10,	0x1f2e7a50, | ||||
| 0x51efaa32,	0xc5ee3906,	0x79125b79,	0x1d2af495, | ||||
| 0xd7358d56,	0xff8e5367,	0xc4234368,	0x3c461649, | ||||
| 0x197af5ba,	0xd22701f7,	0x19ccadbc,	0x808da622, | ||||
| 0x0d5a41b9,	0x34292985,	0x6d57221f,	0x952150b5, | ||||
| 0xf5e39633,	0x65aa7a0c,	0x238fe4ec,	0x692c6d01, | ||||
| 0x0587bd92,	0x298154c5,	0xceb23846,	0xbb18653d, | ||||
| 0x0e081538,	0xd4b81118,	0xb3788dbf,	0x9384e224, | ||||
| 0x126ebd30,	0x6cad6a3f,	0x0915426c,	0x1547b564, | ||||
| 0x22d204ce,	0xfead5812,	0x513c91dd,	0x307cf6ba, | ||||
| 0x1971d8a0,	0x045f93c7,	0x27c96ae2,	0x625a1a6e, | ||||
| 0x940fa029,	0x1cb12b97,	0xc00e41bb,	0x8c6a032b, | ||||
| 0x469108da,	0x4505b8ab,	0x5010b78f,	0x390e0be8, | ||||
| 0xf4bf5a37,	0xf3494ab2,	0x5c9084f5,	0x2a197c7a, | ||||
| 0x5611276e,	0x40b8a450,	0xba4f6321,	0xc772e5cd, | ||||
| 0x0ea7070e,	0xbd4afff0,	0x6a9715ec,	0x21b2e161, | ||||
| 0xfac2ae9b,	0x00e5ff50,	0xceba2003,	0xcd9bf99f, | ||||
| 0xa5dcc3a2,	0xeccb134d,	0x213224c5,	0x37426c43, | ||||
| 0x34af1b6c,	0xe7743de6,	0xc8dd2a26,	0xee5ab984, | ||||
| 0xe09ab493,	0xde0066c7,	0x37529565,	0xbd3dfe53, | ||||
| 0x27202b4e,	0xbcc7a208,	0xed6f4c45,	0x82cab65e, | ||||
| 0x2afc80a9,	0xd063c3c2,	0xf41d48f4,	0xdc5fefee, | ||||
| 0x4111aa68,	0xb20bef31,	0xf8004c44,	0x1c632882, | ||||
| 0xd2530ec9,	0x4e956f3b,	0x240d5d12,	0x3dac3b36, | ||||
| 0x2970d02a,	0xefa4c0eb,	0x950537cf,	0xcdc9d1b9, | ||||
| 0x25449a3d,	0x1e76f046,	0x708114f9,	0x02a9ad00, | ||||
| 0x5186ab9f,	0x8a301145,	0x8175f0f4,	0xacdff2ab, | ||||
| 0xbaca756d,	0x65d33620,	0xe35a5db7,	0x69bb75cb, | ||||
| 0x2f5c123d,	0x841f9c77,	0xffcf384e,	0x3aa6d707, | ||||
| 0x3207be98,	0x83784052,	0x4eb0c27d,	0x6def8ca4, | ||||
| 0x427910cf,	0x28bfceb8,	0x0ebda330,	0x9850fd1e, | ||||
| 0x81e639f4,	0xa838aa33,	0x0174e6e7,	0xd768e4a2, | ||||
| 0x2abe1041,	0x9cc6ecd8,	0x58c20300,	0x5824ebfa, | ||||
| 0xadb81dfc,	0x3770a8b2,	0x473d8f26,	0x1e775e35, | ||||
| 0x259f5ad7,	0x13fef5c5,	0x3aa92640,	0x5a76c79b, | ||||
| 0xdfa3ff6b,	0x43d6bba4,	0xae2a900e,	0x8c698a3e, | ||||
| 0x51ce5a96,	0x66908c24,	0x0911f46e,	0x70d619f7, | ||||
| 0x972efb65,	0xb5c23792,	0x1b3ee153,	0x909746c1, | ||||
| 0x8370fa25,	0xbcde8c5c,	0x1aa4f41d,	0x373a398a, | ||||
| 0x3c8559a2,	0x4b528ba2,	0x54019afe,	0xe409c632, | ||||
| 0x160581e2,	0x7e30d7d4,	0xf841f0a0,	0xdc1d200a, | ||||
| 0x46ed47de,	0x0f77093c,	0xac835c24,	0x2ce29974, | ||||
| 0xc031bfe9,	0xe879d971,	0xa67200ee,	0x3fe62089, | ||||
| 0x90a38599,	0xcf7107d2,	0x45b49b01,	0xebb5ad89, | ||||
| 0x8f42d795,	0x77b19427,	0x800e71fa,	0x6bc93b64, | ||||
| 0xc0cdf4d6,	0x97dc9d9f,	0x7cf2edd3,	0xcb482372, | ||||
| 0x6221fd9e,	0x84492515,	0xbd2b7283,	0xfc15f19e, | ||||
| 0x547a79ae,	0x73337e65,	0xec64a1de,	0x822bf271, | ||||
| 0x65c6b44a,	0x6d3246ea,	0x464aa85a,	0xd5110102, | ||||
| 0x2578e4ef,	0xb5c4273f,	0xef03fde4,	0x1c5358fd, | ||||
| 0x9b30fb66,	0x214b5514,	0xc7c50eb5,	0x76372928, | ||||
| 0x5ec235f3,	0x20df4fbc,	0x12c684c5,	0x141308c1, | ||||
| 0x1ffda6ae,	0x1a64f972,	0xad2f29b8,	0x4de7315a, | ||||
| 0xd0fa953d,	0x8c55fe93,	0xa375129d,	0xd120f9b8, | ||||
| 0xbb20cb19,	0x535d873d,	0x1fa8e047,	0x6dd4c1f5, | ||||
| 0xd456632c,	0xa388867b,	0x762656d5,	0x00812012, | ||||
| 0x1225a049,	0xf7900f05,	0x5b50f75d,	0xf720a919, | ||||
| 0xbb8dcb70,	0xa6d48d13,	0xf750522c,	0x8ad277b3, | ||||
| 0x334daf09,	0x5f882b42,	0x38a53713,	0xe9bbeef7, | ||||
| 0xcc7fd1d6,	0xda484573,	0x4b3e2894,	0xbc0ef5ab, | ||||
| 0xb2be1128,	0x88f27a64,	0x84ccdf55,	0x93aca22b, | ||||
| 0x80b9641e,	0xa2bc2354,	0x5d78ca97,	0xb36ab105, | ||||
| 0xdeb4d233,	0xe7e653bc,	0x7a29de17,	0x950c7ece, | ||||
| 0xca5e997c,	0x5b8d4b6c,	0xaa5b0c7f,	0x2048cacf, | ||||
| 0x71bd96bf,	0x580520f9,	0xc4da2129,	0xa3f0d78e, | ||||
| 0x5235e085,	0x30c220c3,	0x2edbb5eb,	0xd12227ed, | ||||
| 0x67f8faf5,	0x0d5f8ef1,	0xd8176ac6,	0x1ee955f7, | ||||
| 0x13b75133,	0xb935ee9d,	0xdfe2d54f,	0x43ff1de9, | ||||
| 0x6e848017,	0x4011e255,	0x5180f71b,	0x72ed0330, | ||||
| 0xc737adbd,	0x7f6839a6,	0x142bd2d2,	0x66d6143b, | ||||
| 0x69cf3cd0,	0x9b492cb9,	0x3266f995,	0x8ce763fe, | ||||
| 0xdf8493e0,	0x8a981e31,	0xe6351c8e,	0xb0fd34fe, | ||||
| 0xdc236978,	0x385f0118,	0x1c44fcdb,	0xcf70bb77, | ||||
| 0x6046d066,	0x2d9475af,	0x3799ac4b,	0xe9efc39c, | ||||
| 0x90d0450c,	0xa40a5fc6,	0xcfb5ef83,	0x049854c0, | ||||
| 0x7215e231,	0x0424cc7e,	0x56ad0075,	0xff0a28a0, | ||||
| 0x7488be97,	0xe1f82798,	0xc445794d,	0xeb7dd129, | ||||
| 0x631403b5,	0xfcfd85de,	0xbf795cac,	0x00aafac9, | ||||
| 0x6a2fe3ec,	0x294c2bde,	0x12861212,	0xddff6bfb, | ||||
| 0xb0b29b5a,	0x46387e2d,	0x4a5a42a2,	0x4549f462, | ||||
| 0x4f20df9b,	0xd189a190,	0x0ef70bb7,	0xa544ce4b, | ||||
| 0x44a69377,	0x5e8c0f35,	0x2ecf5b5c,	0x0c1b08be, | ||||
| 0x7f054c31,	0x73ed91a2,	0x82cd81c4,	0xf693111c, | ||||
| 0x1ce7be10,	0x55d7acf8,	0x015c32a7,	0x5a3d7795, | ||||
| 0x1372ac6d,	0x038755f6,	0xd1ed8be2,	0xe1b2bd04, | ||||
| 0x20f3c81c,	0x326ffd81,	0x658c1e11,	0x37f74017, | ||||
| 0x0a8388b2,	0xa8e74512,	0xcb9f97ab,	0x3588376e, | ||||
| 0x483048d2,	0xe3ee2145,	0x029eba71,	0x2a6efdb8, | ||||
| 0x7e629d7c,	0xe7458f31,	0xd2edd71b,	0xa265588c, | ||||
| 0xee3a7a3d,	0xc3f6a74d,	0xb55fbbb2,	0xac3dc469, | ||||
| 0x350e24ac,	0xfdfb094c,	0xc6760d93,	0x014aad92, | ||||
| 0x4bf74e51,	0x9ab932af,	0xc600d00f,	0x5dd0c96d, | ||||
| 0x6b081fbe,	0xecba3e1c,	0x19abcf55,	0x46905ea0, | ||||
| 0x41ff2a8f,	0x9305e1c0,	0xdbfa1df1,	0x8100370e, | ||||
| 0x0df9b3df,	0x09763efc,	0x60447b79,	0xb64eb88a, | ||||
| 0xe4c706de,	0x2dadc973,	0xf6bc6357,	0x7395486a, | ||||
| 0xf15aae31,	0x1daca268,	0xa5b8395f,	0x127bcb11, | ||||
| 0xe84c9715,	0xe0417152,	0xc3d8520e,	0x0bdcbb00, | ||||
| 0xf3daba82,	0xe1925ffb,	0x3526a2e8,	0xda189c78, | ||||
| 0xa32bf2fc,	0xe7de02ab,	0x2f344593,	0x07b916dd, | ||||
| 0xe2d46b57,	0x83921885,	0x6f066626,	0x7ce5ab67, | ||||
| 0xebcaf5de,	0xbb0f6b00,	0x6d1faffb,	0x1eff0018, | ||||
| 0x2debe6bc,	0x57d003b3,	0x3a3f5f80,	0xec6b7c0e, | ||||
| 0x9f1dd663,	0xbebdbf56,	0x98e5774e,	0xb7a29504, | ||||
| 0x5166a8c5,	0xaf7ce332,	0xca5e70c5,	0xfe235309, | ||||
| 0x9c23f707,	0x99b08cc4,	0x2fe1edd1,	0xba36918f, | ||||
| 0x262dd395,	0x423edc8c,	0x801e8f1f,	0x5b4cc6c5, | ||||
| 0x3fcdf7f4,	0x5a490992,	0xd4006978,	0x977e2f86, | ||||
| 0x6311af7b,	0x06bb2412,	0x2be72eb1,	0x5706b252, | ||||
| 0xa000c75b,	0xe3ea5cff,	0xc9208730,	0xd9e369fb, | ||||
| 0x1aed50e2,	0x8916d70d,	0x87f01eb6,	0x663b8f67, | ||||
| 0x3dc68ee3,	0x5197b72b,	0xddb19fb8,	0x6839be2a, | ||||
| 0x99fcfc25,	0x5542f267,	0xa922eea9,	0xc9ae9d93, | ||||
| 0xcf8a9d64,	0x76bfeec4,	0xacbcd4c6,	0x81960ab0, | ||||
| 0x7b24eb81,	0x8e8cad81,	0xfb2c1362,	0x9ccf1224, | ||||
| 0x16d2c962,	0x18f7d553,	0x2a7f9c1e,	0x3678f775, | ||||
| 0x1210588a,	0xe1644769,	0x3dd29db7,	0xbe9daa2c, | ||||
| 0xe9c4e13a,	0x8d9de528,	0x19c3075e,	0x68a336d4, | ||||
| 0x0ba157f3,	0xe3780ca6,	0x69c54c28,	0x9f96bb00, | ||||
| 0xa78204e9,	0x1c8627cf,	0x2fd52aa9,	0x957b15ed, | ||||
| 0xd3d61e03,	0x658cea71,	0x42d77750,	0x0c0755bc, | ||||
| 0xde372a0d,	0x0d3687d7,	0xc04c56f6,	0xc3882257, | ||||
| 0x98fd462c,	0xb65fac1e,	0x01b5ecab,	0xd554413d, | ||||
| 0xb4beec40,	0xb4caab5e,	0xdeee4085,	0xd1b0500c, | ||||
| 0x6845de70,	0x5a06e889,	0xfc89a4a7,	0xedbfd435, | ||||
| 0xac039058,	0x9c1acd2f,	0x876fbfac,	0x9d8b83f3, | ||||
| 0x8aa71c5f,	0x2e0f12ef,	0x87ff0c68,	0x53a9d19a, | ||||
| 0x0ee62d27,	0x5d93a3f4,	0x7f13dc77,	0xd4ec7c79, | ||||
| 0xd72a35c8,	0xb84ba058,	0x21e1d1ad,	0xbcf9c0fe, | ||||
| 0x106fb166,	0x84ff4a86,	0x3b2d960f,	0x4cf3ab0e, | ||||
| 0x65d25f76,	0xdcda7e29,	0xc444ddc8,	0xe97096dc, | ||||
| 0xbfe1815c,	0x25b9dec5,	0x7aed80de,	0x6cbb6f7a, | ||||
| 0x2daf76b7,	0x249ee47f,	0xdc6e770d,	0xa5a02e7d, | ||||
| 0xd019d0d7,	0x17feead1,	0xbf80c1f6,	0x83644ac0, | ||||
| 0x412f1ce4,	0x59c1de41,	0x1a47db26,	0x8848ab89, | ||||
| 0xc2c17745,	0x31183c80,	0x9bb13cc3,	0x6da9c349, | ||||
| 0x414b378d,	0xd58df4ba,	0x41f5ca37,	0x02a5162f, | ||||
| 0x2843bb24,	0xbd2bb85a,	0x0b2c6e81,	0x2d50fe1d, | ||||
| 0xc67b2c07,	0x630ce2b3,	0x73274d84,	0x3b4ba900, | ||||
| 0x5e672d3c,	0x7ef23846,	0x81036625,	0x380b3d3b, | ||||
| 0x391470b1,	0x5b3dcbed,	0x63038751,	0xa0c7aed8, | ||||
| 0xc185b677,	0x516b8170,	0xbf79f025,	0x2b4c9edb, | ||||
| 0x29354139,	0x9deabe33,	0x2838f581,	0x0574281f, | ||||
| 0xc1267da2,	0x0c070755,	0x6832a8b9,	0x57436eed, | ||||
| 0xe604c645,	0x4f13172a,	0x3227ac12,	0xf6b78267, | ||||
| 0xbbd5d003,	0x5f8ae7ed,	0x74b6682c,	0x356b9e81, | ||||
| 0x82703c20,	0x8ccf1f78,	0xa6b79197,	0x434d5316, | ||||
| 0x1ba0853a,	0xe6ae4829,	0x1193ed0a,	0xa2d171f0, | ||||
| 0x4f565a15,	0xf78ea4af,	0xa9a27e39,	0x30a45316, | ||||
| 0xc005a8f6,	0x79a23d86,	0x07edcbe3,	0x3b76806b, | ||||
| 0x3df6268a,	0xb0f33186,	0x2fd51855,	0xb34efefe, | ||||
| 0xa24ce423,	0x6c62d711,	0x335c7252,	0x0d2ddcff, | ||||
| 0x64485539,	0x00c8a89e,	0x4827ad2d,	0x01de50f4, | ||||
| 0x593a9a38,	0xee90b919,	0xf523cd40,	0x97ed7009, | ||||
| 0x1038e6b0,	0x95931966,	0xaaac22b9,	0xef1b9915, | ||||
| 0x23f6d33c,	0xe417a460,	0x4e9b59c2,	0x3fd38b75, | ||||
| 0x7ceabd08,	0x8279d672,	0xf24936e8,	0x668630f8, | ||||
| 0x3cb0ddc0,	0x56c56418,	0x91221ef8,	0xc8926c65, | ||||
| 0x4d7436b6,	0xc06b5b1e,	0xdea496b1,	0x4fa4c971, | ||||
| 0xeea15028,	0x7aead456,	0x1329b826,	0xcf9a4d4f, | ||||
| 0xabd69aba,	0x9dd78c2e,	0x5e9782ff,	0x563f3cb0, | ||||
| 0xfc2db55c,	0xb2d5f64b,	0x9478caeb,	0x7409ae76, | ||||
| 0xc4690516,	0xb12bb352,	0xad5283c7,	0x608e7a23, | ||||
| 0xc8b4b59a,	0x0da06391,	0x9a6ccd78,	0xe4af91ad, | ||||
| 0xb156f74a,	0x790b21dd,	0x6ce9970b,	0x46e89ac1, | ||||
| 0x07815d28,	0x1f2fc3ac,	0x690cd168,	0x6ae48bb4, | ||||
| 0x1ed48c84,	0xe5f121a3,	0x49a762cf,	0xc5e8fd6a, | ||||
| 0x75d45162,	0xf49c2c5e,	0xd161eb4a,	0xb6351b73, | ||||
| 0xc2605562,	0xb097aa9d,	0x114421ee,	0xf93baf78, | ||||
| 0x82b9b2ab,	0x0374be4d,	0xd715656b,	0x3524549f, | ||||
| 0xb37dc283,	0xfa8308d0,	0x3f69f2be,	0x238bc31e, | ||||
| 0x839f3f68,	0x0639b8d7,	0xa8cdbe8e,	0xd15c7cb3, | ||||
| 0x0a31ec87,	0x39a57286,	0x7c3ffef5,	0x461d70b2, | ||||
| 0x7d1e8a90,	0x629b803f,	0x351b6cb8,	0x255391c2, | ||||
| 0x07215420,	0x5e1aef8c,	0xa3b48e74,	0x8fa78c73, | ||||
| 0xb6fab65c,	0xb13cb77f,	0x5bd44236,	0x31cbeab2, | ||||
| 0x9f68d29a,	0x207a2b05,	0x668ac8a7,	0xb6de6033, | ||||
| 0x3d2a4173,	0x04a2543a,	0x559b1b7c,	0x5e9116d4, | ||||
| 0x5cb3ee57,	0x4a47f644,	0x90be9381,	0xbccc9cd2, | ||||
| 0x3160e0d5,	0xed791f87,	0xdd9da7a8,	0x3e6d398b, | ||||
| 0x6a68ad78,	0x418974ef,	0xfd010940,	0x8bed7055, | ||||
| 0xf21e4d13,	0xac8160b9,	0x85f10ecb,	0xd637b0e2, | ||||
| 0x987dd54e,	0x9835f225,	0xdbee940c,	0x9a34e16d, | ||||
| 0x15fcfb54,	0x6720e48c,	0x9a42e266,	0x31eb0270, | ||||
| 0x714dee04,	0xbcd417d8,	0xedf7757e,	0x099c4e89, | ||||
| 0xee3e6c2e,	0x6246d530,	0xfbdad1d6,	0xbbe301a3, | ||||
| 0xe08f829c,	0xa3c7d9c4,	0xe753a1dd,	0xf1466da1, | ||||
| 0xa1e353a7,	0x33828150,	0x267d4059,	0x458bd806, | ||||
| 0xac0ed307,	0x2079bf7c,	0xb25200db,	0x9dfd338c, | ||||
| 0x0b94573e,	0x8188fa16,	0x9e641b63,	0xafa2a60c, | ||||
| 0x61e5f820,	0x63a38983,	0x172d3a6f,	0xc98a34b2, | ||||
| 0x532b56f5,	0x1883cb1a,	0x93ba9692,	0x7d85d109, | ||||
| 0xd20ffd1a,	0xcc6e9937,	0xb3813eb1,	0xea7e1b45, | ||||
| 0xf1e09c71,	0x35aa1ab9,	0xbd2d43d7,	0xc53a07ef, | ||||
| 0xf3fa3fd6,	0xf3cd1e20,	0x5e620481,	0xd7bec1b0, | ||||
| 0xc7d3caf6,	0xe9eae29f,	0x19c5b2c1,	0x940e3186, | ||||
| 0x200f0a30,	0xbaf511b1,	0x103cb39c,	0x3f46b067, | ||||
| 0xba6c5e9a,	0xc32b5592,	0x393e8503,	0x7ea29847, | ||||
| 0x04d4a493,	0x18fc67d5,	0xea4ff94e,	0xc0281d5e, | ||||
| 0xaeeaae85,	0x13be6b70,	0xa1bc8be4,	0xa1edbe06, | ||||
| 0x572b8b35,	0x3baca7c5,	0x06ac9591,	0x8309b11d, | ||||
| 0x7f381b05,	0xb16dd9b2,	0xf9b5d898,	0xb2e04c3a, | ||||
| 0xed89b7dd,	0xd30e7e33,	0x4ac6cb61,	0xd2c50800, | ||||
| 0x6554ae61,	0xa263efe2,	0x666244c3,	0xb6aaa480, | ||||
| 0xcb4344ee,	0x31cf3efa,	0x14a4a476,	0xf6804765, | ||||
| 0xaca47c23,	0x7e15ae69,	0xaffade7d,	0x693a6ff9, | ||||
| 0x3f0f22c0,	0xe6135bcb,	0xf0632009,	0x06fa2abb, | ||||
| 0xad0c1085,	0x3ce130b3,	0x70001594,	0xd80c452b, | ||||
| 0x486c9d1f,	0x93b94966,	0x81612f95,	0x7573faea, | ||||
| 0x1568ddb9,	0x3c1d26e5,	0x0a5d7b45,	0x5ea78077, | ||||
| 0x1c5491f9,	0x24363c4b,	0x54b8e62a,	0xb86697e6, | ||||
| 0x18750c76,	0xa355cee8,	0x9c09de46,	0xb022ec2b, | ||||
| 0xfa142272,	0xd1e1dcce,	0xc7c2f6c9,	0xd8e72fc1, | ||||
							
								
								
									
										98
									
								
								src/cpu/intel/model_206ax/model_206ax.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										98
									
								
								src/cpu/intel/model_206ax/model_206ax.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,98 @@ | ||||
| /* | ||||
|  * This file is part of the coreboot project. | ||||
|  * | ||||
|  * Copyright (C) 2011 The ChromiumOS Authors. All rights reserved. | ||||
|  * | ||||
|  * This program is free software; you can redistribute it and/or | ||||
|  * modify it under the terms of the GNU General Public License as | ||||
|  * published by the Free Software Foundation; version 2 of | ||||
|  * the License. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License | ||||
|  * along with this program; if not, write to the Free Software | ||||
|  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, | ||||
|  * MA 02110-1301 USA | ||||
|  */ | ||||
|  | ||||
| #ifndef _CPU_INTEL_MODEL_206AX_H | ||||
| #define _CPU_INTEL_MODEL_206AX_H | ||||
|  | ||||
| /* SandyBridge bus clock is fixed at 100MHz */ | ||||
| #define SANDYBRIDGE_BCLK		100 | ||||
|  | ||||
| #define IA32_FEATURE_CONTROL		0x3a | ||||
| #define  CPUID_VMX			(1 << 5) | ||||
| #define  CPUID_SMX			(1 << 6) | ||||
| #define MSR_FEATURE_CONFIG		0x13c | ||||
| #define IA32_PLATFORM_DCA_CAP		0x1f8 | ||||
| #define IA32_MISC_ENABLE		0x1a0 | ||||
| #define IA32_PERF_CTL 			0x199 | ||||
| #define IA32_THERM_INTERRUPT		0x19b | ||||
| #define IA32_ENERGY_PERFORMANCE_BIAS	0x1b0 | ||||
| #define  ENERGY_POLICY_PERFORMANCE	0 | ||||
| #define  ENERGY_POLICY_NORMAL		6 | ||||
| #define  ENERGY_POLICY_POWERSAVE	15 | ||||
| #define IA32_PACKAGE_THERM_INTERRUPT	0x1b2 | ||||
| #define MSR_LT_LOCK_MEMORY		0x2e7 | ||||
| #define IA32_MC0_STATUS 		0x401 | ||||
|  | ||||
| #define MSR_PIC_MSG_CONTROL		0x2e | ||||
| #define MSR_PLATFORM_INFO		0xce | ||||
| #define  PLATFORM_INFO_SET_TDP		(1 << 29) | ||||
| #define MSR_PMG_CST_CONFIG_CONTROL	0xe2 | ||||
| #define MSR_PMG_IO_CAPTURE_BASE		0xe4 | ||||
|  | ||||
| #define MSR_MISC_PWR_MGMT		0x1aa | ||||
| #define  MISC_PWR_MGMT_EIST_HW_DIS	(1 << 0) | ||||
| #define MSR_TURBO_RATIO_LIMIT		0x1ad | ||||
| #define MSR_POWER_CTL			0x1fc | ||||
|  | ||||
| #define MSR_PKGC3_IRTL			0x60a | ||||
| #define MSR_PKGC6_IRTL			0x60b | ||||
| #define MSR_PKGC7_IRTL			0x60c | ||||
| #define  IRTL_VALID			(1 << 15) | ||||
| #define  IRTL_1_NS			(0 << 10) | ||||
| #define  IRTL_32_NS			(1 << 10) | ||||
| #define  IRTL_1024_NS			(2 << 10) | ||||
| #define  IRTL_32768_NS			(3 << 10) | ||||
| #define  IRTL_1048576_NS		(4 << 10) | ||||
| #define  IRTL_33554432_NS		(5 << 10) | ||||
| #define  IRTL_RESPONSE_MASK		(0x3ff) | ||||
|  | ||||
| /* long duration in low dword, short duration in high dword */ | ||||
| #define MSR_PKG_POWER_LIMIT		0x610 | ||||
| #define  PKG_POWER_LIMIT_MASK		0x7fff | ||||
| #define  PKG_POWER_LIMIT_EN		(1 << 15) | ||||
| #define  PKG_POWER_LIMIT_CLAMP		(1 << 16) | ||||
| #define  PKG_POWER_LIMIT_TIME_SHIFT	17 | ||||
| #define  PKG_POWER_LIMIT_TIME_MASK	0x7f | ||||
|  | ||||
| #define MSR_PP0_CURRENT_CONFIG		0x601 | ||||
| #define  PP0_CURRENT_LIMIT		(112 << 3) /* 112 A */ | ||||
| #define MSR_PP1_CURRENT_CONFIG		0x602 | ||||
| #define  PP1_CURRENT_LIMIT		(35 << 3) /* 35 A */ | ||||
| #define MSR_PKG_POWER_SKU_UNIT		0x606 | ||||
| #define MSR_PKG_POWER_SKU		0x614 | ||||
| #define MSR_PP0_POWER_LIMIT		0x638 | ||||
| #define MSR_PP1_POWER_LIMIT		0x640 | ||||
|  | ||||
| /* P-state configuration */ | ||||
| #define PSS_MAX_ENTRIES			8 | ||||
| #define PSS_RATIO_STEP			2 | ||||
| #define PSS_LATENCY_TRANSITION		10 | ||||
| #define PSS_LATENCY_BUSMASTER		10 | ||||
|  | ||||
| #ifdef __SMM__ | ||||
| /* Lock MSRs */ | ||||
| void intel_model_206ax_finalize_smm(void); | ||||
| #else | ||||
| /* Configure power limits for turbo mode */ | ||||
| void set_power_limits(u8 power_limit_1_time); | ||||
| #endif | ||||
|  | ||||
| #endif | ||||
							
								
								
									
										558
									
								
								src/cpu/intel/model_206ax/model_206ax_init.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										558
									
								
								src/cpu/intel/model_206ax/model_206ax_init.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,558 @@ | ||||
| /* | ||||
|  * This file is part of the coreboot project. | ||||
|  * | ||||
|  * Copyright (C) 2007-2009 coresystems GmbH | ||||
|  * Copyright (C) 2011 The ChromiumOS Authors.  All rights reserved. | ||||
|  * | ||||
|  * This program is free software; you can redistribute it and/or | ||||
|  * modify it under the terms of the GNU General Public License as | ||||
|  * published by the Free Software Foundation; version 2 of | ||||
|  * the License. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License | ||||
|  * along with this program; if not, write to the Free Software | ||||
|  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, | ||||
|  * MA 02110-1301 USA | ||||
|  */ | ||||
|  | ||||
| #include <console/console.h> | ||||
| #include <device/device.h> | ||||
| #include <device/pci.h> | ||||
| #include <string.h> | ||||
| #include <arch/acpi.h> | ||||
| #include <cpu/cpu.h> | ||||
| #include <cpu/x86/mtrr.h> | ||||
| #include <cpu/x86/msr.h> | ||||
| #include <cpu/x86/lapic.h> | ||||
| #include <cpu/intel/microcode.h> | ||||
| #include <cpu/intel/speedstep.h> | ||||
| #include <cpu/intel/turbo.h> | ||||
| #include <cpu/x86/cache.h> | ||||
| #include <cpu/x86/name.h> | ||||
| #include <pc80/mc146818rtc.h> | ||||
| #include <usbdebug.h> | ||||
| #include "model_206ax.h" | ||||
|  | ||||
| /* | ||||
|  * List of suported C-states in this processor | ||||
|  * | ||||
|  * Latencies are typical worst-case package exit time in uS | ||||
|  * taken from the SandyBridge BIOS specification. | ||||
|  */ | ||||
| static acpi_cstate_t cstate_map[] = { | ||||
| 	{	/* 0: C0 */ | ||||
| 	},{	/* 1: C1 */ | ||||
| 		.latency = 1, | ||||
| 		.power = 1000, | ||||
| 		.resource = { | ||||
| 			.addrl = 0x00,	/* MWAIT State 0 */ | ||||
| 			.space_id = ACPI_ADDRESS_SPACE_FIXED, | ||||
| 			.bit_width = ACPI_FFIXEDHW_VENDOR_INTEL, | ||||
| 			.bit_offset = ACPI_FFIXEDHW_CLASS_MWAIT, | ||||
| 			.resv = ACPI_FFIXEDHW_FLAG_HW_COORD, | ||||
| 		} | ||||
| 	}, | ||||
| 	{	/* 2: C1E */ | ||||
| 		.latency = 1, | ||||
| 		.power = 1000, | ||||
| 		.resource = { | ||||
| 			.addrl = 0x01,	/* MWAIT State 0 Sub-state 1 */ | ||||
| 			.space_id = ACPI_ADDRESS_SPACE_FIXED, | ||||
| 			.bit_width = ACPI_FFIXEDHW_VENDOR_INTEL, | ||||
| 			.bit_offset = ACPI_FFIXEDHW_CLASS_MWAIT, | ||||
| 			.resv = ACPI_FFIXEDHW_FLAG_HW_COORD, | ||||
| 		} | ||||
| 	}, | ||||
| 	{	/* 3: C3 */ | ||||
| 		.latency = 63, | ||||
| 		.power = 500, | ||||
| 		.resource = { | ||||
| 			.addrl = 0x10,	/* MWAIT State 1 */ | ||||
| 			.space_id = ACPI_ADDRESS_SPACE_FIXED, | ||||
| 			.bit_width = ACPI_FFIXEDHW_VENDOR_INTEL, | ||||
| 			.bit_offset = ACPI_FFIXEDHW_CLASS_MWAIT, | ||||
| 			.resv = ACPI_FFIXEDHW_FLAG_HW_COORD, | ||||
| 		} | ||||
| 	}, | ||||
| 	{	/* 4: C6 */ | ||||
| 		.latency = 87, | ||||
| 		.power = 350, | ||||
| 		.resource = { | ||||
| 			.addrl = 0x20,	/* MWAIT State 2 */ | ||||
| 			.space_id = ACPI_ADDRESS_SPACE_FIXED, | ||||
| 			.bit_width = ACPI_FFIXEDHW_VENDOR_INTEL, | ||||
| 			.bit_offset = ACPI_FFIXEDHW_CLASS_MWAIT, | ||||
| 			.resv = ACPI_FFIXEDHW_FLAG_HW_COORD, | ||||
| 		} | ||||
| 	}, | ||||
| 	{	/* 5: C7 */ | ||||
| 		.latency = 90, | ||||
| 		.power = 200, | ||||
| 		.resource = { | ||||
| 			.addrl = 0x30,	/* MWAIT State 3 */ | ||||
| 			.space_id = ACPI_ADDRESS_SPACE_FIXED, | ||||
| 			.bit_width = ACPI_FFIXEDHW_VENDOR_INTEL, | ||||
| 			.bit_offset = ACPI_FFIXEDHW_CLASS_MWAIT, | ||||
| 			.resv = ACPI_FFIXEDHW_FLAG_HW_COORD, | ||||
| 		} | ||||
| 	}, | ||||
| 	{	/* 6: C7S */ | ||||
| 		.latency = 90, | ||||
| 		.power = 200, | ||||
| 		.resource = { | ||||
| 			.addrl = 0x31,	/* MWAIT State 3 Sub-state 1 */ | ||||
| 			.space_id = ACPI_ADDRESS_SPACE_FIXED, | ||||
| 			.bit_width = ACPI_FFIXEDHW_VENDOR_INTEL, | ||||
| 			.bit_offset = ACPI_FFIXEDHW_CLASS_MWAIT, | ||||
| 			.resv = ACPI_FFIXEDHW_FLAG_HW_COORD, | ||||
| 		} | ||||
| 	}, | ||||
| 	{ 0 } | ||||
| }; | ||||
|  | ||||
| static const uint32_t microcode_updates[] = { | ||||
| 	#include "x06_microcode.h" | ||||
| }; | ||||
|  | ||||
| static void enable_vmx(void) | ||||
| { | ||||
| 	struct cpuid_result regs; | ||||
| 	msr_t msr; | ||||
| 	int enable = CONFIG_ENABLE_VMX; | ||||
|  | ||||
| 	msr = rdmsr(IA32_FEATURE_CONTROL); | ||||
|  | ||||
| 	if (msr.lo & (1 << 0)) { | ||||
| 		printk(BIOS_ERR, "VMX is locked, so enable_vmx will do nothing\n"); | ||||
| 		/* VMX locked. If we set it again we get an illegal | ||||
| 		 * instruction | ||||
| 		 */ | ||||
| 		return; | ||||
| 	} | ||||
|  | ||||
| 	regs = cpuid(1); | ||||
| 	printk(BIOS_DEBUG, "%s VMX\n", enable ? "Enabling" : "Disabling"); | ||||
| 	if (regs.ecx & CPUID_VMX) { | ||||
| 		if (enable) | ||||
| 			msr.lo |= (1 << 2); | ||||
| 		else | ||||
| 			msr.lo &= ~(1 << 2); | ||||
|  | ||||
| 		if (regs.ecx & CPUID_SMX) { | ||||
| 			if (enable) | ||||
| 				msr.lo |= (1 << 1); | ||||
| 			else | ||||
| 				msr.lo &= ~(1 << 1); | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	wrmsr(IA32_FEATURE_CONTROL, msr); | ||||
| } | ||||
|  | ||||
| /* Convert time in seconds to POWER_LIMIT_1_TIME MSR value */ | ||||
| static const u8 power_limit_time_sec_to_msr[] = { | ||||
| 	[0]   = 0x00, | ||||
| 	[1]   = 0x0a, | ||||
| 	[2]   = 0x0b, | ||||
| 	[3]   = 0x4b, | ||||
| 	[4]   = 0x0c, | ||||
| 	[5]   = 0x2c, | ||||
| 	[6]   = 0x4c, | ||||
| 	[7]   = 0x6c, | ||||
| 	[8]   = 0x0d, | ||||
| 	[10]  = 0x2d, | ||||
| 	[12]  = 0x4d, | ||||
| 	[14]  = 0x6d, | ||||
| 	[16]  = 0x0e, | ||||
| 	[20]  = 0x2e, | ||||
| 	[24]  = 0x4e, | ||||
| 	[28]  = 0x6e, | ||||
| 	[32]  = 0x0f, | ||||
| 	[40]  = 0x2f, | ||||
| 	[48]  = 0x4f, | ||||
| 	[56]  = 0x6f, | ||||
| 	[64]  = 0x10, | ||||
| 	[80]  = 0x30, | ||||
| 	[96]  = 0x50, | ||||
| 	[112] = 0x70, | ||||
| 	[128] = 0x11, | ||||
| }; | ||||
|  | ||||
| /* Convert POWER_LIMIT_1_TIME MSR value to seconds */ | ||||
| static const u8 power_limit_time_msr_to_sec[] = { | ||||
| 	[0x00] = 0, | ||||
| 	[0x0a] = 1, | ||||
| 	[0x0b] = 2, | ||||
| 	[0x4b] = 3, | ||||
| 	[0x0c] = 4, | ||||
| 	[0x2c] = 5, | ||||
| 	[0x4c] = 6, | ||||
| 	[0x6c] = 7, | ||||
| 	[0x0d] = 8, | ||||
| 	[0x2d] = 10, | ||||
| 	[0x4d] = 12, | ||||
| 	[0x6d] = 14, | ||||
| 	[0x0e] = 16, | ||||
| 	[0x2e] = 20, | ||||
| 	[0x4e] = 24, | ||||
| 	[0x6e] = 28, | ||||
| 	[0x0f] = 32, | ||||
| 	[0x2f] = 40, | ||||
| 	[0x4f] = 48, | ||||
| 	[0x6f] = 56, | ||||
| 	[0x10] = 64, | ||||
| 	[0x30] = 80, | ||||
| 	[0x50] = 96, | ||||
| 	[0x70] = 112, | ||||
| 	[0x11] = 128, | ||||
| }; | ||||
|  | ||||
| /* | ||||
|  * Configure processor power limits if possible | ||||
|  * This must be done AFTER set of BIOS_RESET_CPL | ||||
|  */ | ||||
| void set_power_limits(u8 power_limit_1_time) | ||||
| { | ||||
| 	msr_t msr = rdmsr(MSR_PLATFORM_INFO); | ||||
| 	msr_t limit; | ||||
| 	unsigned power_unit; | ||||
| 	unsigned tdp, min_power, max_power, max_time; | ||||
| 	u8 power_limit_1_val; | ||||
|  | ||||
| 	if (power_limit_1_time > ARRAY_SIZE(power_limit_time_sec_to_msr)) | ||||
| 		return; | ||||
|  | ||||
| 	if (!(msr.lo & PLATFORM_INFO_SET_TDP)) | ||||
| 		return; | ||||
|  | ||||
| 	/* Get units */ | ||||
| 	msr = rdmsr(MSR_PKG_POWER_SKU_UNIT); | ||||
| 	power_unit = 2 << ((msr.lo & 0xf) - 1); | ||||
|  | ||||
| 	/* Get power defaults for this SKU */ | ||||
| 	msr = rdmsr(MSR_PKG_POWER_SKU); | ||||
| 	tdp = msr.lo & 0x7fff; | ||||
| 	min_power = (msr.lo >> 16) & 0x7fff; | ||||
| 	max_power = msr.hi & 0x7fff; | ||||
| 	max_time = (msr.hi >> 16) & 0x7f; | ||||
|  | ||||
| 	printk(BIOS_DEBUG, "CPU TDP: %u Watts\n", tdp / power_unit); | ||||
|  | ||||
| 	if (power_limit_time_msr_to_sec[max_time] > power_limit_1_time) | ||||
| 		power_limit_1_time = power_limit_time_msr_to_sec[max_time]; | ||||
|  | ||||
| 	if (min_power > 0 && tdp < min_power) | ||||
| 		tdp = min_power; | ||||
|  | ||||
| 	if (max_power > 0 && tdp > max_power) | ||||
| 		tdp = max_power; | ||||
|  | ||||
| 	power_limit_1_val = power_limit_time_sec_to_msr[power_limit_1_time]; | ||||
|  | ||||
| 	/* Set long term power limit to TDP */ | ||||
| 	limit.lo = 0; | ||||
| 	limit.lo |= tdp & PKG_POWER_LIMIT_MASK; | ||||
| 	limit.lo |= PKG_POWER_LIMIT_EN; | ||||
| 	limit.lo |= (power_limit_1_val & PKG_POWER_LIMIT_TIME_MASK) << | ||||
| 		PKG_POWER_LIMIT_TIME_SHIFT; | ||||
|  | ||||
| 	/* Set short term power limit to 1.25 * TDP */ | ||||
| 	limit.hi = 0; | ||||
| 	limit.hi |= ((tdp * 125) / 100) & PKG_POWER_LIMIT_MASK; | ||||
| 	limit.hi |= PKG_POWER_LIMIT_EN; | ||||
| 	/* Power limit 2 time is only programmable on SNB EP/EX */ | ||||
|  | ||||
| 	wrmsr(MSR_PKG_POWER_LIMIT, limit); | ||||
| } | ||||
|  | ||||
| static void configure_c_states(void) | ||||
| { | ||||
| 	msr_t msr; | ||||
|  | ||||
| 	msr = rdmsr(MSR_PMG_CST_CONFIG_CONTROL); | ||||
| 	msr.lo |= (1 << 28);	// C1 Auto Undemotion Enable | ||||
| 	msr.lo |= (1 << 27);	// C3 Auto Undemotion Enable | ||||
| 	msr.lo |= (1 << 26);	// C1 Auto Demotion Enable | ||||
| 	msr.lo |= (1 << 25);	// C3 Auto Demotion Enable | ||||
| 	msr.lo &= ~(1 << 10);	// Disable IO MWAIT redirection | ||||
| 	msr.lo |= 7;		// No package C-state limit | ||||
| 	wrmsr(MSR_PMG_CST_CONFIG_CONTROL, msr); | ||||
|  | ||||
| 	msr = rdmsr(MSR_PMG_IO_CAPTURE_BASE); | ||||
| 	msr.lo &= ~0x7ffff; | ||||
| 	msr.lo |= (PMB0_BASE + 4);	// LVL_2 base address | ||||
| 	msr.lo |= (2 << 16);		// CST Range: C7 is max C-state | ||||
| 	wrmsr(MSR_PMG_IO_CAPTURE_BASE, msr); | ||||
|  | ||||
| 	msr = rdmsr(MSR_MISC_PWR_MGMT); | ||||
| 	msr.lo &= ~(1 << 0);	// Enable P-state HW_ALL coordination | ||||
| 	wrmsr(MSR_MISC_PWR_MGMT, msr); | ||||
|  | ||||
| 	msr = rdmsr(MSR_POWER_CTL); | ||||
| 	msr.lo |= (1 << 18);	// Enable Energy Perf Bias MSR 0x1b0 | ||||
| 	msr.lo |= (1 << 1);	// C1E Enable | ||||
| 	msr.lo |= (1 << 0);	// Bi-directional PROCHOT# | ||||
| 	wrmsr(MSR_POWER_CTL, msr); | ||||
|  | ||||
| 	/* C3 Interrupt Response Time Limit */ | ||||
| 	msr.hi = 0; | ||||
| 	msr.lo = IRTL_VALID | IRTL_1024_NS | 0x50; | ||||
| 	wrmsr(MSR_PKGC3_IRTL, msr); | ||||
|  | ||||
| 	/* C6 Interrupt Response Time Limit */ | ||||
| 	msr.hi = 0; | ||||
| 	msr.lo = IRTL_VALID | IRTL_1024_NS | 0x68; | ||||
| 	wrmsr(MSR_PKGC6_IRTL, msr); | ||||
|  | ||||
| 	/* C7 Interrupt Response Time Limit */ | ||||
| 	msr.hi = 0; | ||||
| 	msr.lo = IRTL_VALID | IRTL_1024_NS | 0x6D; | ||||
| 	wrmsr(MSR_PKGC7_IRTL, msr); | ||||
|  | ||||
| 	/* Primary Plane Current Limit */ | ||||
| 	msr = rdmsr(MSR_PP0_CURRENT_CONFIG); | ||||
| 	msr.lo &= ~0x1fff; | ||||
| 	msr.lo |= PP0_CURRENT_LIMIT; | ||||
| 	wrmsr(MSR_PP0_CURRENT_CONFIG, msr); | ||||
|  | ||||
| 	/* Secondary Plane Current Limit */ | ||||
| 	msr = rdmsr(MSR_PP1_CURRENT_CONFIG); | ||||
| 	msr.lo &= ~0x1fff; | ||||
| 	msr.lo |= PP1_CURRENT_LIMIT; | ||||
| 	wrmsr(MSR_PP1_CURRENT_CONFIG, msr); | ||||
| } | ||||
|  | ||||
| static void configure_misc(void) | ||||
| { | ||||
| 	msr_t msr; | ||||
|  | ||||
| 	msr = rdmsr(IA32_MISC_ENABLE); | ||||
| 	msr.lo |= (1 << 0);	  /* Fast String enable */ | ||||
| 	msr.lo |= (1 << 3); 	  /* TM1/TM2/EMTTM enable */ | ||||
| 	msr.lo |= (1 << 16);	  /* Enhanced SpeedStep Enable */ | ||||
| 	wrmsr(IA32_MISC_ENABLE, msr); | ||||
|  | ||||
| 	/* Disable Thermal interrupts */ | ||||
| 	msr.lo = 0; | ||||
| 	msr.hi = 0; | ||||
| 	wrmsr(IA32_THERM_INTERRUPT, msr); | ||||
|  | ||||
| 	/* Enable package critical interrupt only */ | ||||
| 	msr.lo = 1 << 4; | ||||
| 	msr.hi = 0; | ||||
| 	wrmsr(IA32_PACKAGE_THERM_INTERRUPT, msr); | ||||
| } | ||||
|  | ||||
| static void enable_lapic_tpr(void) | ||||
| { | ||||
| 	msr_t msr; | ||||
|  | ||||
| 	msr = rdmsr(MSR_PIC_MSG_CONTROL); | ||||
| 	msr.lo &= ~(1 << 10);	/* Enable APIC TPR updates */ | ||||
| 	wrmsr(MSR_PIC_MSG_CONTROL, msr); | ||||
| } | ||||
|  | ||||
| static void configure_dca_cap(void) | ||||
| { | ||||
| 	struct cpuid_result cpuid_regs; | ||||
| 	msr_t msr; | ||||
|  | ||||
| 	/* Check feature flag in CPUID.(EAX=1):ECX[18]==1 */ | ||||
| 	cpuid_regs = cpuid(1); | ||||
| 	if (cpuid_regs.ecx & (1 << 18)) { | ||||
| 		msr = rdmsr(IA32_PLATFORM_DCA_CAP); | ||||
| 		msr.lo |= 1; | ||||
| 		wrmsr(IA32_PLATFORM_DCA_CAP, msr); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| static void set_max_ratio(void) | ||||
| { | ||||
| 	msr_t msr; | ||||
|  | ||||
| 	/* Platform Info bits 15:8 give max ratio */ | ||||
| 	msr = rdmsr(MSR_PLATFORM_INFO); | ||||
| 	msr.hi = 0; | ||||
| 	msr.lo &= 0xff00; | ||||
| 	wrmsr(IA32_PERF_CTL, msr); | ||||
|  | ||||
| 	printk(BIOS_DEBUG, "model_x06ax: frequency set to %d\n", | ||||
| 	       ((msr.lo >> 8) & 0xff) * 100); | ||||
| } | ||||
|  | ||||
| static void set_energy_perf_bias(u8 policy) | ||||
| { | ||||
| 	msr_t msr; | ||||
|  | ||||
| 	/* Energy Policy is bits 3:0 */ | ||||
| 	msr = rdmsr(IA32_ENERGY_PERFORMANCE_BIAS); | ||||
| 	msr.lo &= ~0xf; | ||||
| 	msr.lo |= policy & 0xf; | ||||
| 	wrmsr(IA32_ENERGY_PERFORMANCE_BIAS, msr); | ||||
|  | ||||
| 	printk(BIOS_DEBUG, "model_x06ax: energy policy set to %u\n", | ||||
| 	       policy); | ||||
| } | ||||
|  | ||||
| static void configure_mca(void) | ||||
| { | ||||
| 	msr_t msr; | ||||
| 	int i; | ||||
|  | ||||
| 	msr.lo = msr.hi = 0; | ||||
| 	/* This should only be done on a cold boot */ | ||||
| 	for (i = 0; i < 7; i++) | ||||
| 		wrmsr(IA32_MC0_STATUS + (i * 4), msr); | ||||
| } | ||||
|  | ||||
| #if CONFIG_USBDEBUG | ||||
| static unsigned ehci_debug_addr; | ||||
| #endif | ||||
|  | ||||
| /* | ||||
|  * Initialize any extra cores/threads in this package. | ||||
|  */ | ||||
| static void intel_cores_init(device_t cpu) | ||||
| { | ||||
| 	struct cpuid_result result; | ||||
| 	unsigned cores, threads, i; | ||||
|  | ||||
| 	result = cpuid_ext(0xb, 0); /* Threads per core */ | ||||
| 	threads = result.ebx & 0xff; | ||||
|  | ||||
| 	result = cpuid_ext(0xb, 1); /* Cores per package */ | ||||
| 	cores = result.ebx & 0xff; | ||||
|  | ||||
| 	/* Only initialize extra cores from BSP */ | ||||
| 	if (cpu->path.apic.apic_id) | ||||
| 		return; | ||||
|  | ||||
| 	printk(BIOS_DEBUG, "CPU: %u has %u cores %u threads\n", | ||||
| 	       cpu->path.apic.apic_id, cores, threads); | ||||
|  | ||||
| 	for (i = 1; i < cores; ++i) { | ||||
| 		struct device_path cpu_path; | ||||
| 		device_t new; | ||||
|  | ||||
| 		/* Build the cpu device path */ | ||||
| 		cpu_path.type = DEVICE_PATH_APIC; | ||||
| 		cpu_path.apic.apic_id = | ||||
| 			cpu->path.apic.apic_id + i; | ||||
|  | ||||
| 		/* Update APIC ID if no hyperthreading */ | ||||
| 		if (threads == 1) | ||||
| 			cpu_path.apic.apic_id <<= 1; | ||||
|  | ||||
| 		/* Allocate the new cpu device structure */ | ||||
| 		new = alloc_dev(cpu->bus, &cpu_path); | ||||
| 		if (!new) | ||||
| 			continue; | ||||
|  | ||||
| 		printk(BIOS_DEBUG, "CPU: %u has core %u\n", | ||||
| 		       cpu->path.apic.apic_id, | ||||
| 		       new->path.apic.apic_id); | ||||
|  | ||||
| 		/* Start the new cpu */ | ||||
| 		if (!start_cpu(new)) { | ||||
| 			/* Record the error in cpu? */ | ||||
| 			printk(BIOS_ERR, "CPU %u would not start!\n", | ||||
| 			       new->path.apic.apic_id); | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| static void model_206ax_init(device_t cpu) | ||||
| { | ||||
| 	char processor_name[49]; | ||||
| 	struct cpuid_result cpuid_regs; | ||||
|  | ||||
| 	/* Turn on caching if we haven't already */ | ||||
| 	x86_enable_cache(); | ||||
|  | ||||
| 	/* Update the microcode */ | ||||
| 	intel_update_microcode(microcode_updates); | ||||
|  | ||||
| 	/* Clear out pending MCEs */ | ||||
| 	configure_mca(); | ||||
|  | ||||
| 	/* Print processor name */ | ||||
| 	fill_processor_name(processor_name); | ||||
| 	printk(BIOS_INFO, "CPU: %s.\n", processor_name); | ||||
|  | ||||
| #if CONFIG_USBDEBUG | ||||
| 	// Is this caution really needed? | ||||
| 	if(!ehci_debug_addr) | ||||
| 		ehci_debug_addr = get_ehci_debug(); | ||||
| 	set_ehci_debug(0); | ||||
| #endif | ||||
|  | ||||
| 	/* Setup MTRRs based on physical address size */ | ||||
| 	cpuid_regs = cpuid(0x80000008); | ||||
| 	x86_setup_fixed_mtrrs(); | ||||
| 	x86_setup_var_mtrrs(cpuid_regs.eax & 0xff, 2); | ||||
| 	x86_mtrr_check(); | ||||
|  | ||||
| 	/* Setup Page Attribute Tables (PAT) */ | ||||
| 	// TODO set up PAT | ||||
|  | ||||
| #if CONFIG_USBDEBUG | ||||
| 	set_ehci_debug(ehci_debug_addr); | ||||
| #endif | ||||
|  | ||||
| 	/* Enable the local cpu apics */ | ||||
| 	enable_lapic_tpr(); | ||||
| 	setup_lapic(); | ||||
|  | ||||
| 	/* Enable virtualization if enabled in CMOS */ | ||||
| 	enable_vmx(); | ||||
|  | ||||
| 	/* Configure C States */ | ||||
| 	configure_c_states(); | ||||
|  | ||||
| 	/* Configure Enhanced SpeedStep and Thermal Sensors */ | ||||
| 	configure_misc(); | ||||
|  | ||||
| 	/* Enable Direct Cache Access */ | ||||
| 	configure_dca_cap(); | ||||
|  | ||||
| 	/* Set energy policy */ | ||||
| 	set_energy_perf_bias(ENERGY_POLICY_NORMAL); | ||||
|  | ||||
| 	/* Set Max Ratio */ | ||||
| 	set_max_ratio(); | ||||
|  | ||||
| 	/* Enable Turbo */ | ||||
| 	enable_turbo(); | ||||
|  | ||||
| 	/* Start up extra cores */ | ||||
| 	intel_cores_init(cpu); | ||||
| } | ||||
|  | ||||
| static struct device_operations cpu_dev_ops = { | ||||
| 	.init     = model_206ax_init, | ||||
| }; | ||||
|  | ||||
| static struct cpu_device_id cpu_table[] = { | ||||
| 	{ X86_VENDOR_INTEL, 0x206a0 }, /* Intel Sandybridge */ | ||||
| 	{ X86_VENDOR_INTEL, 0x206a6 }, /* Intel Sandybridge D1 */ | ||||
| 	{ X86_VENDOR_INTEL, 0x206a7 }, /* Intel Sandybridge D2/J1 */ | ||||
| 	{ X86_VENDOR_INTEL, 0x306a2 }, /* Intel IvyBridge */ | ||||
| 	{ X86_VENDOR_INTEL, 0x306a4 }, /* Intel IvyBridge */ | ||||
| 	{ X86_VENDOR_INTEL, 0x306a5 }, /* Intel IvyBridge */ | ||||
| 	{ X86_VENDOR_INTEL, 0x306a6 }, /* Intel IvyBridge */ | ||||
| 	{ X86_VENDOR_INTEL, 0x306a8 }, /* Intel IvyBridge */ | ||||
| 	{ X86_VENDOR_INTEL, 0x306a9 }, /* Intel IvyBridge */ | ||||
| 	{ 0, 0 }, | ||||
| }; | ||||
|  | ||||
| static const struct cpu_driver driver __cpu_driver = { | ||||
| 	.ops      = &cpu_dev_ops, | ||||
| 	.id_table = cpu_table, | ||||
| 	.cstates  = cstate_map, | ||||
| }; | ||||
|  | ||||
							
								
								
									
										31
									
								
								src/cpu/intel/model_206ax/x06_microcode.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								src/cpu/intel/model_206ax/x06_microcode.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,31 @@ | ||||
| /* | ||||
|  * This file is part of the coreboot project. | ||||
|  * | ||||
|  * Copyright (C) 2011 Google Inc. | ||||
|  * | ||||
|  * This program is free software; you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  * the Free Software Foundation; version 2 of the License. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License | ||||
|  * along with this program; if not, write to the Free Software | ||||
|  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA | ||||
|  */ | ||||
|  | ||||
|  | ||||
| #if CONFIG_NORTHBRIDGE_INTEL_SANDYBRIDGE | ||||
| 	#include "microcode-m12206a7_00000025.h" | ||||
| #elif CONFIG_NORTHBRIDGE_INTEL_IVYBRIDGE | ||||
| #else | ||||
| #error "Which microcode to use?" | ||||
| #endif | ||||
| 	/*  Dummy terminator  */ | ||||
|         0x0, 0x0, 0x0, 0x0, | ||||
|         0x0, 0x0, 0x0, 0x0, | ||||
|         0x0, 0x0, 0x0, 0x0, | ||||
|         0x0, 0x0, 0x0, 0x0, | ||||
							
								
								
									
										16
									
								
								src/cpu/intel/socket_rPGA989/Kconfig
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								src/cpu/intel/socket_rPGA989/Kconfig
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,16 @@ | ||||
| config CPU_INTEL_SOCKET_RPGA989 | ||||
| 	bool | ||||
|  | ||||
| if CPU_INTEL_SOCKET_RPGA989 | ||||
|  | ||||
| config SOCKET_SPECIFIC_OPTIONS # dummy | ||||
| 	def_bool y | ||||
| 	select MMX | ||||
| 	select SSE | ||||
| 	select CACHE_AS_RAM | ||||
|  | ||||
| config CACHE_MRC_BIN | ||||
| 	bool | ||||
| 	default n | ||||
|  | ||||
| endif | ||||
							
								
								
									
										8
									
								
								src/cpu/intel/socket_rPGA989/Makefile.inc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								src/cpu/intel/socket_rPGA989/Makefile.inc
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,8 @@ | ||||
| ramstage-y += socket_rPGA989.c | ||||
| subdirs-y += ../../x86/tsc | ||||
| subdirs-y += ../../x86/mtrr | ||||
| subdirs-y += ../../x86/lapic | ||||
| subdirs-y += ../../x86/cache | ||||
| subdirs-y += ../../x86/smm | ||||
| subdirs-y += ../microcode | ||||
| subdirs-y += ../turbo | ||||
							
								
								
									
										4
									
								
								src/cpu/intel/socket_rPGA989/chip.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								src/cpu/intel/socket_rPGA989/chip.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,4 @@ | ||||
| extern struct chip_operations cpu_intel_socket_rPGA989_ops; | ||||
|  | ||||
| struct cpu_intel_socket_rPGA989_config { | ||||
| }; | ||||
							
								
								
									
										6
									
								
								src/cpu/intel/socket_rPGA989/socket_rPGA989.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								src/cpu/intel/socket_rPGA989/socket_rPGA989.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,6 @@ | ||||
| #include <device/device.h> | ||||
| #include "chip.h" | ||||
|  | ||||
| struct chip_operations cpu_intel_socket_rPGA989_ops = { | ||||
| 	CHIP_NAME("Socket rPGA989 CPU") | ||||
| }; | ||||
		Reference in New Issue
	
	Block a user