x86: mtrr: Use MP calls to list the MTRRs

Update the mtrr command to use mp_run_on_cpus() to obtain its information.
Since the selected CPU is the boot CPU this does not change the result,
but it sets the stage for supporting other CPUs.

Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Wolfgang Wallner <wolfgang.wallner@br-automation.com>
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
This commit is contained in:
Simon Glass 2020-07-17 08:48:22 -06:00 committed by Bin Meng
parent 0538d6833c
commit 240752c612
3 changed files with 62 additions and 4 deletions

View file

@ -21,6 +21,7 @@
#include <log.h> #include <log.h>
#include <asm/cache.h> #include <asm/cache.h>
#include <asm/io.h> #include <asm/io.h>
#include <asm/mp.h>
#include <asm/msr.h> #include <asm/msr.h>
#include <asm/mtrr.h> #include <asm/mtrr.h>
@ -63,6 +64,16 @@ static void set_var_mtrr(uint reg, uint type, uint64_t start, uint64_t size)
wrmsrl(MTRR_PHYS_MASK_MSR(reg), mask | MTRR_PHYS_MASK_VALID); wrmsrl(MTRR_PHYS_MASK_MSR(reg), mask | MTRR_PHYS_MASK_VALID);
} }
void mtrr_read_all(struct mtrr_info *info)
{
int i;
for (i = 0; i < MTRR_COUNT; i++) {
info->mtrr[i].base = native_read_msr(MTRR_PHYS_BASE_MSR(i));
info->mtrr[i].mask = native_read_msr(MTRR_PHYS_MASK_MSR(i));
}
}
int mtrr_commit(bool do_caches) int mtrr_commit(bool do_caches)
{ {
struct mtrr_request *req = gd->arch.mtrr_req; struct mtrr_request *req = gd->arch.mtrr_req;

View file

@ -70,6 +70,26 @@ struct mtrr_state {
bool enable_cache; bool enable_cache;
}; };
/**
* struct mtrr - Information about a single MTRR
*
* @base: Base address and MTRR_BASE_TYPE_MASK
* @mask: Mask and MTRR_PHYS_MASK_VALID
*/
struct mtrr {
u64 base;
u64 mask;
};
/**
* struct mtrr_info - Information about all MTRRs
*
* @mtrr: Information about each mtrr
*/
struct mtrr_info {
struct mtrr mtrr[MTRR_COUNT];
};
/** /**
* mtrr_open() - Prepare to adjust MTRRs * mtrr_open() - Prepare to adjust MTRRs
* *
@ -129,6 +149,16 @@ int mtrr_commit(bool do_caches);
*/ */
int mtrr_set_next_var(uint type, uint64_t base, uint64_t size); int mtrr_set_next_var(uint type, uint64_t base, uint64_t size);
/**
* mtrr_read_all() - Save all the MTRRs
*
* This reads all MTRRs from the boot CPU into a struct so they can be loaded
* onto other CPUs
*
* @info: Place to put the MTRR info
*/
void mtrr_read_all(struct mtrr_info *info);
#endif #endif
#if ((CONFIG_XIP_ROM_SIZE & (CONFIG_XIP_ROM_SIZE - 1)) != 0) #if ((CONFIG_XIP_ROM_SIZE & (CONFIG_XIP_ROM_SIZE - 1)) != 0)

View file

@ -5,7 +5,9 @@
#include <common.h> #include <common.h>
#include <command.h> #include <command.h>
#include <log.h>
#include <asm/msr.h> #include <asm/msr.h>
#include <asm/mp.h>
#include <asm/mtrr.h> #include <asm/mtrr.h>
static const char *const mtrr_type_name[MTRR_TYPE_COUNT] = { static const char *const mtrr_type_name[MTRR_TYPE_COUNT] = {
@ -18,19 +20,32 @@ static const char *const mtrr_type_name[MTRR_TYPE_COUNT] = {
"Back", "Back",
}; };
static int do_mtrr_list(void) static void read_mtrrs(void *arg)
{ {
struct mtrr_info *info = arg;
mtrr_read_all(info);
}
static int do_mtrr_list(int cpu_select)
{
struct mtrr_info info;
int ret;
int i; int i;
printf("Reg Valid Write-type %-16s %-16s %-16s\n", "Base ||", printf("Reg Valid Write-type %-16s %-16s %-16s\n", "Base ||",
"Mask ||", "Size ||"); "Mask ||", "Size ||");
memset(&info, '\0', sizeof(info));
ret = mp_run_on_cpus(cpu_select, read_mtrrs, &info);
if (ret)
return log_msg_ret("run", ret);
for (i = 0; i < MTRR_COUNT; i++) { for (i = 0; i < MTRR_COUNT; i++) {
const char *type = "Invalid"; const char *type = "Invalid";
uint64_t base, mask, size; uint64_t base, mask, size;
bool valid; bool valid;
base = native_read_msr(MTRR_PHYS_BASE_MSR(i)); base = info.mtrr[i].base;
mask = native_read_msr(MTRR_PHYS_MASK_MSR(i)); mask = info.mtrr[i].mask;
size = ~mask & ((1ULL << CONFIG_CPU_ADDR_BITS) - 1); size = ~mask & ((1ULL << CONFIG_CPU_ADDR_BITS) - 1);
size |= (1 << 12) - 1; size |= (1 << 12) - 1;
size += 1; size += 1;
@ -102,11 +117,13 @@ static int do_mtrr(struct cmd_tbl *cmdtp, int flag, int argc,
char *const argv[]) char *const argv[])
{ {
const char *cmd; const char *cmd;
int cpu_select;
uint reg; uint reg;
cpu_select = MP_SELECT_BSP;
cmd = argv[1]; cmd = argv[1];
if (argc < 2 || *cmd == 'l') if (argc < 2 || *cmd == 'l')
return do_mtrr_list(); return do_mtrr_list(cpu_select);
argc -= 2; argc -= 2;
argv += 2; argv += 2;
if (argc <= 0) if (argc <= 0)