mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-10 23:24:38 +00:00
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:
parent
0538d6833c
commit
240752c612
3 changed files with 62 additions and 4 deletions
|
@ -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;
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Reference in a new issue