]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
x86: mtrr: Use MP calls to list the MTRRs
authorSimon Glass <sjg@chromium.org>
Fri, 17 Jul 2020 14:48:22 +0000 (08:48 -0600)
committerBin Meng <bmeng.cn@gmail.com>
Mon, 20 Jul 2020 01:46:46 +0000 (09:46 +0800)
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>
arch/x86/cpu/mtrr.c
arch/x86/include/asm/mtrr.h
cmd/x86/mtrr.c

index 7ec0733337d80aafa127eba467aca7cfeaf5c6f1..c9b4e7d06ee4409a1413ec32f324369571ba07b1 100644 (file)
@@ -21,6 +21,7 @@
 #include <log.h>
 #include <asm/cache.h>
 #include <asm/io.h>
+#include <asm/mp.h>
 #include <asm/msr.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);
 }
 
+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)
 {
        struct mtrr_request *req = gd->arch.mtrr_req;
index 212a699c1b2cca89d4712a6d9d192aacde811b9f..e1f1a44643603faf0b272ef29e9d0e124dabf12a 100644 (file)
@@ -70,6 +70,26 @@ struct mtrr_state {
        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
  *
@@ -129,6 +149,16 @@ int mtrr_commit(bool do_caches);
  */
 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
 
 #if ((CONFIG_XIP_ROM_SIZE & (CONFIG_XIP_ROM_SIZE - 1)) != 0)
index 5d25c5802af47c49dda9943b7c12bd49e0018fb6..f357f587670b67f0d81cd3d7fed7135f8ad095a8 100644 (file)
@@ -5,7 +5,9 @@
 
 #include <common.h>
 #include <command.h>
+#include <log.h>
 #include <asm/msr.h>
+#include <asm/mp.h>
 #include <asm/mtrr.h>
 
 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",
 };
 
-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;
 
        printf("Reg Valid Write-type   %-16s %-16s %-16s\n", "Base   ||",
               "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++) {
                const char *type = "Invalid";
                uint64_t base, mask, size;
                bool valid;
 
-               base = native_read_msr(MTRR_PHYS_BASE_MSR(i));
-               mask = native_read_msr(MTRR_PHYS_MASK_MSR(i));
+               base = info.mtrr[i].base;
+               mask = info.mtrr[i].mask;
                size = ~mask & ((1ULL << CONFIG_CPU_ADDR_BITS) - 1);
                size |= (1 << 12) - 1;
                size += 1;
@@ -102,11 +117,13 @@ static int do_mtrr(struct cmd_tbl *cmdtp, int flag, int argc,
                   char *const argv[])
 {
        const char *cmd;
+       int cpu_select;
        uint reg;
 
+       cpu_select = MP_SELECT_BSP;
        cmd = argv[1];
        if (argc < 2 || *cmd == 'l')
-               return do_mtrr_list();
+               return do_mtrr_list(cpu_select);
        argc -= 2;
        argv += 2;
        if (argc <= 0)