[coreboot] [patch 15/16] Query cpu instead of usingCONFIG_CPU_ADDR_BITS on AMD cpus

Scott Duplichan scott at notabs.org
Sun Nov 7 20:05:21 CET 2010


-----Original Message-----
From: coreboot-bounces at coreboot.org [mailto:coreboot-bounces at coreboot.org] On Behalf Of Tobias Diedrich
Sent: Sunday, November 07, 2010 06:47 AM
To: coreboot at coreboot.org
Cc: Rudolf Marek; Tobias Diedrich
Subject: [coreboot] [patch 15/16] Query cpu instead of usingCONFIG_CPU_ADDR_BITS on AMD cpus

]This fixes a FIXME in src/cpu/amd/mtrr/amd_mtrr.c and shuts up the
]Linux kernel, which was previously complaining that the MTRR setup
]is wrong, if the cpu supports more than CONFIG_CPU_ADDR_BITS bits of
]address space.
]
]dmesg without patch:
]|MTRR variable ranges enabled:
]|  0 base 0000000000 mask 0F00000000 write-back
]|  1 base 0100000000 mask 0FC0000000 write-back
]|  2 base 00E0000000 mask 0FE0000000 uncachable
]|  3 disabled
]|  4 disabled
]|  5 disabled
]|  6 disabled
]|  7 disabled
]|mtrr: your BIOS has configured an incorrect mask, fixing it.
]
]dmesg with patch:
]|MTRR variable ranges enabled:
]|  0 base 0000000000 mask FF00000000 write-back
]|  1 base 0100000000 mask FFC0000000 write-back
]|  2 base 00E0000000 mask FFE0000000 uncachable
]|  3 disabled
]|  4 disabled
]|  5 disabled
]|  6 disabled
]|  7 disabled
]
]Shamelessly copied from Linux arch/x86/kernel/cpu/mtrr/main.c
]
]Signed-off-by: Tobias Diedrich <ranma+coreboot at tdiedrich.de>
]
]---
]
]Index: src/cpu/amd/mtrr/amd_mtrr.c
]===================================================================
]--- src/cpu/amd/mtrr/amd_mtrr.c	(revision 5985)
]+++ src/cpu/amd/mtrr/amd_mtrr.c	(working copy)
]@@ -1,5 +1,6 @@
] #include <console/console.h>
] #include <device/device.h>
]+#include <arch/cpu.h>
] #include <cpu/x86/mtrr.h>
] #include <cpu/amd/mtrr.h>
] #include <cpu/x86/cache.h>
]@@ -175,11 +176,13 @@
] 
] 	enable_cache();
] 
]-	/* FIXME we should probably query the cpu for this
]-	 * but so far this is all any recent AMD cpu has supported.
]-	 */
] 	address_bits = CONFIG_CPU_ADDR_BITS; //K8 could be 40, and GH could be 48
] 
]+	/* AMD specific MSR to query number of address bits */
]+	if (cpuid_eax(0x80000000) >= 0x80000008) {
]+		address_bits = cpuid_eax(0x80000008) & 0xff;
]+	}
]+
] 	/* Now that I have mapped what is memory and what is not
] 	 * Setup the mtrrs so we can cache the memory.
] 	 */


Thank you Tobias. It also fixes a Win7 checked build BSOD when kconfig
CPU_ADDR_BITS is set too small. Tested with Kino-780AM2 by setting
CPU_ADDR_BITS to 36 and confirming 48 bits are set in msr 201.

Acked-by: Scott Duplichan <scott at notabs.org>

It looks like Intel eventually adopted this cpuid feature, though
I have no way to test the Intel implementation.

One comment could be clarified:

- /* AMD specific MSR to query number of address bits */
+ /* AMD specific cpuid function to query number of address bits */

Thanks,
Scott






More information about the coreboot mailing list