cpu/x86/mtrr: add helper function to detect variable MTRRs

The current MTRR API doesn't allow one to detect variable MTRRs
along with handling fixed MTRRs in one function call. Therefore,
add x86_setup_mtrrs_with_detect() to perform the same actions
as x86_setup_mtrrs() but always do the dynamic detection.

Change-Id: I443909691afa28ce11882e2beab12e836e5bcb3d
Signed-off-by: Aaron Durbin <adurbin@chromium.org>
Reviewed-on: https://review.coreboot.org/13935
Reviewed-by: Furquan Shaikh <furquan@google.com>
Tested-by: build bot (Jenkins)
This commit is contained in:
Aaron Durbin 2016-03-07 16:05:36 -06:00 committed by Martin Roth
parent e99e2b65cf
commit e63be8971b
2 changed files with 19 additions and 6 deletions

View File

@ -789,8 +789,6 @@ void x86_setup_var_mtrrs(unsigned int address_bits, unsigned int above4gb)
addr_space = get_physical_address_space(); addr_space = get_physical_address_space();
if (sol == NULL) { if (sol == NULL) {
if (above4gb == 2)
detect_var_mtrrs();
sol = &mtrr_global_solution; sol = &mtrr_global_solution;
sol->mtrr_default_type = sol->mtrr_default_type =
calc_var_mtrrs(addr_space, !!above4gb, address_bits); calc_var_mtrrs(addr_space, !!above4gb, address_bits);
@ -804,12 +802,21 @@ void x86_setup_var_mtrrs(unsigned int address_bits, unsigned int above4gb)
void x86_setup_mtrrs(void) void x86_setup_mtrrs(void)
{ {
int address_size; int address_size;
x86_setup_fixed_mtrrs(); x86_setup_fixed_mtrrs();
address_size = cpu_phys_address_size(); address_size = cpu_phys_address_size();
printk(BIOS_DEBUG, "CPU physical address size: %d bits\n", address_size); printk(BIOS_DEBUG, "CPU physical address size: %d bits\n",
address_size);
/* Always handle addresses above 4GiB. */
x86_setup_var_mtrrs(address_size, 1); x86_setup_var_mtrrs(address_size, 1);
} }
void x86_setup_mtrrs_with_detect(void)
{
detect_var_mtrrs();
x86_setup_mtrrs();
}
void x86_mtrr_check(void) void x86_mtrr_check(void)
{ {
/* Only Pentium Pro and later have MTRR */ /* Only Pentium Pro and later have MTRR */

View File

@ -56,14 +56,20 @@
* of the nature of the global MTRR enable flag. Therefore, all direct * of the nature of the global MTRR enable flag. Therefore, all direct
* or indirect callers of enable_fixed_mtrr() should ensure that the * or indirect callers of enable_fixed_mtrr() should ensure that the
* variable MTRR MSRs do not contain bad ranges. * variable MTRR MSRs do not contain bad ranges.
*
* Note that this function sets up MTRRs for addresses above 4GiB.
*/ */
void x86_setup_mtrrs(void); void x86_setup_mtrrs(void);
/*
* x86_setup_mtrrs_with_detect() does the same thing as x86_setup_mtrrs(), but
* it always dynamically detects the number of variable MTRRs available.
*/
void x86_setup_mtrrs_with_detect(void);
/* /*
* x86_setup_var_mtrrs() parameters: * x86_setup_var_mtrrs() parameters:
* address_bits - number of physical address bits supported by cpu * address_bits - number of physical address bits supported by cpu
* above4gb - 2 means dynamically detect number of variable MTRRs available. * above4gb - if set setup MTRRs for addresses above 4GiB else ignore
* non-zero means handle memory ranges above 4GiB. * memory ranges above 4GiB
* 0 means ignore memory ranges above 4GiB
*/ */
void x86_setup_var_mtrrs(unsigned int address_bits, unsigned int above4gb); void x86_setup_var_mtrrs(unsigned int address_bits, unsigned int above4gb);
void enable_fixed_mtrr(void); void enable_fixed_mtrr(void);