Revert "cpu/x86/mtrr: Make useful MTRR functions available for all boot stages"
This code is only meant to be used in early stages so move it back to
earlymtrr.c.
This reverts commit 3ad00d0c89
.
Change-Id: I9bc1ac4b863eb43d3e398e6462ee139a7751bf62
Signed-off-by: Arthur Heymans <arthur@aheymans.xyz>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/64804
Reviewed-by: Subrata Banik <subratabanik@google.com>
Reviewed-by: Lean Sheng Tan <sheng.tan@9elements.com>
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
This commit is contained in:
parent
481599f2c8
commit
460936567f
|
@ -1,11 +1,5 @@
|
|||
ramstage-y += mtrr.c
|
||||
|
||||
ramstage-y += mtrrlib.c
|
||||
postcar-y += mtrrlib.c
|
||||
romstage-y += mtrrlib.c
|
||||
bootblock-y += mtrrlib.c
|
||||
verstage_x86-y += mtrrlib.c
|
||||
|
||||
romstage-y += earlymtrr.c
|
||||
bootblock-y += earlymtrr.c
|
||||
verstage_x86-y += earlymtrr.c
|
||||
|
|
|
@ -7,6 +7,66 @@
|
|||
#include <commonlib/bsd/helpers.h>
|
||||
#include <stdint.h>
|
||||
|
||||
/* Get first available variable MTRR.
|
||||
* Returns var# if available, else returns -1.
|
||||
*/
|
||||
int get_free_var_mtrr(void)
|
||||
{
|
||||
msr_t maskm;
|
||||
int vcnt;
|
||||
int i;
|
||||
|
||||
vcnt = get_var_mtrr_count();
|
||||
|
||||
/* Identify the first var mtrr which is not valid. */
|
||||
for (i = 0; i < vcnt; i++) {
|
||||
maskm = rdmsr(MTRR_PHYS_MASK(i));
|
||||
if ((maskm.lo & MTRR_PHYS_MASK_VALID) == 0)
|
||||
return i;
|
||||
}
|
||||
|
||||
/* No free var mtrr. */
|
||||
return -1;
|
||||
}
|
||||
|
||||
void set_var_mtrr(
|
||||
unsigned int reg, unsigned int base, unsigned int size,
|
||||
unsigned int type)
|
||||
{
|
||||
/* Bit 32-35 of MTRRphysMask should be set to 1 */
|
||||
/* FIXME: It only support 4G less range */
|
||||
msr_t basem, maskm;
|
||||
|
||||
if (!IS_POWER_OF_2(size))
|
||||
printk(BIOS_ERR, "MTRR Error: size %#x is not a power of two\n", size);
|
||||
if (size < 4 * KiB)
|
||||
printk(BIOS_ERR, "MTRR Error: size %#x smaller than 4KiB\n", size);
|
||||
if (base % size != 0)
|
||||
printk(BIOS_ERR, "MTRR Error: base %#x must be aligned to size %#x\n", base,
|
||||
size);
|
||||
|
||||
basem.lo = base | type;
|
||||
basem.hi = 0;
|
||||
wrmsr(MTRR_PHYS_BASE(reg), basem);
|
||||
maskm.lo = ~(size - 1) | MTRR_PHYS_MASK_VALID;
|
||||
maskm.hi = (1 << (cpu_phys_address_size() - 32)) - 1;
|
||||
wrmsr(MTRR_PHYS_MASK(reg), maskm);
|
||||
}
|
||||
|
||||
void clear_all_var_mtrr(void)
|
||||
{
|
||||
msr_t mtrr = {0, 0};
|
||||
int vcnt;
|
||||
int i;
|
||||
|
||||
vcnt = get_var_mtrr_count();
|
||||
|
||||
for (i = 0; i < vcnt; i++) {
|
||||
wrmsr(MTRR_PHYS_MASK(i), mtrr);
|
||||
wrmsr(MTRR_PHYS_BASE(i), mtrr);
|
||||
}
|
||||
}
|
||||
|
||||
void var_mtrr_context_init(struct var_mtrr_context *ctx)
|
||||
{
|
||||
ctx->max_var_mtrrs = get_var_mtrr_count();
|
||||
|
|
|
@ -1,65 +0,0 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
|
||||
#include <cpu/cpu.h>
|
||||
#include <cpu/x86/mtrr.h>
|
||||
#include <cpu/x86/msr.h>
|
||||
#include <console/console.h>
|
||||
|
||||
/* Get first available variable MTRR.
|
||||
* Returns var# if available, else returns -1.
|
||||
*/
|
||||
int get_free_var_mtrr(void)
|
||||
{
|
||||
msr_t maskm;
|
||||
int vcnt;
|
||||
int i;
|
||||
|
||||
vcnt = get_var_mtrr_count();
|
||||
|
||||
/* Identify the first var mtrr which is not valid. */
|
||||
for (i = 0; i < vcnt; i++) {
|
||||
maskm = rdmsr(MTRR_PHYS_MASK(i));
|
||||
if ((maskm.lo & MTRR_PHYS_MASK_VALID) == 0)
|
||||
return i;
|
||||
}
|
||||
|
||||
/* No free var mtrr. */
|
||||
return -1;
|
||||
}
|
||||
|
||||
void set_var_mtrr(
|
||||
unsigned int reg, unsigned int base, unsigned int size, unsigned int type)
|
||||
{
|
||||
/* Bit 32-35 of MTRRphysMask should be set to 1 */
|
||||
/* FIXME: It only support 4G less range */
|
||||
msr_t basem, maskm;
|
||||
|
||||
if (!IS_POWER_OF_2(size))
|
||||
printk(BIOS_ERR, "MTRR Error: size %#x is not a power of two\n", size);
|
||||
if (size < 4 * KiB)
|
||||
printk(BIOS_ERR, "MTRR Error: size %#x smaller than 4KiB\n", size);
|
||||
if (base % size != 0)
|
||||
printk(BIOS_ERR, "MTRR Error: base %#x must be aligned to size %#x\n", base,
|
||||
size);
|
||||
|
||||
basem.lo = base | type;
|
||||
basem.hi = 0;
|
||||
wrmsr(MTRR_PHYS_BASE(reg), basem);
|
||||
maskm.lo = ~(size - 1) | MTRR_PHYS_MASK_VALID;
|
||||
maskm.hi = (1 << (cpu_phys_address_size() - 32)) - 1;
|
||||
wrmsr(MTRR_PHYS_MASK(reg), maskm);
|
||||
}
|
||||
|
||||
void clear_all_var_mtrr(void)
|
||||
{
|
||||
msr_t mtrr = {0, 0};
|
||||
int vcnt;
|
||||
int i;
|
||||
|
||||
vcnt = get_var_mtrr_count();
|
||||
|
||||
for (i = 0; i < vcnt; i++) {
|
||||
wrmsr(MTRR_PHYS_MASK(i), mtrr);
|
||||
wrmsr(MTRR_PHYS_BASE(i), mtrr);
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue