public inbox for u-boot@lists.denx.de
 help / color / mirror / Atom feed
* [U-Boot] [PATCH] keystone2: add high memory test
@ 2015-07-08 15:51 Vitaly Andrianov
  2015-07-21 21:28 ` Tom Rini
  0 siblings, 1 reply; 3+ messages in thread
From: Vitaly Andrianov @ 2015-07-08 15:51 UTC (permalink / raw)
  To: u-boot

Keystone2 SOC physical DDR3 address range is outside the first 4GB and
cannot be entirely accessible without MMU enabled. Only first 2GB of
the physical memory have 32-bits aliased addresses. This patch adds u-boot
shell command that allows to enable/disable MMU and map the 1GB of
36bits physical memory to the first 4GB address range.

Signed-off-by: Vitaly Andrianov <vitalya@ti.com>
---
 arch/arm/mach-keystone/Makefile  |   3 +-
 arch/arm/mach-keystone/highmem.c | 162 +++++++++++++++++++++++++++++++++++++++
 2 files changed, 164 insertions(+), 1 deletion(-)
 create mode 100644 arch/arm/mach-keystone/highmem.c

diff --git a/arch/arm/mach-keystone/Makefile b/arch/arm/mach-keystone/Makefile
index ed030db..56b6457 100644
--- a/arch/arm/mach-keystone/Makefile
+++ b/arch/arm/mach-keystone/Makefile
@@ -1,5 +1,5 @@
 #
-# (C) Copyright 2012-2014
+# (C) Copyright 2012-2015
 #     Texas Instruments Incorporated, <www.ti.com>
 #
 # SPDX-License-Identifier:     GPL-2.0+
@@ -16,3 +16,4 @@ obj-y	+= cmd_mon.o
 obj-y	+= msmc.o
 obj-y	+= ddr3.o cmd_ddr3.o
 obj-y	+= keystone.o
+obj-y	+= highmem.o
diff --git a/arch/arm/mach-keystone/highmem.c b/arch/arm/mach-keystone/highmem.c
new file mode 100644
index 0000000..d024e04
--- /dev/null
+++ b/arch/arm/mach-keystone/highmem.c
@@ -0,0 +1,162 @@
+/*
+ * Keystone2: High Memory Test
+ *
+ * (C) Copyright 2013-2015
+ *     Texas Instruments Incorporated, <www.ti.com>
+ *
+ * SPDX-License-Identifier:     GPL-2.0+
+ */
+
+#include <common.h>
+/*
+ * Keysone2 systems which have more then 2GB of DDR2A memory
+ * cannot access that memory without MMU enable. In order to test
+ * the entire memory we need to create MMU translation table,
+ * enable MMU and test the memory in portions. After the test
+ * we need to disable MMU.
+ *
+ * We assume that the memory size >= 2GB and u-boot code is relocated
+ * to the upper GB of the PA address range and the 0x80000000-0xbfffffff
+ * address range is available to use for testing.
+ *
+ * The code will create simple 1 level page table with 4 entries of
+ * 1GB blocks. The block with VA 0x80000000-0xbfffffff will be used
+ * to map different portions of the DDR3a.
+ *
+ */
+
+#include <common.h>
+#include <asm/armv7.h>
+
+static unsigned long long pgd_table[4] __aligned(0x1000);
+static unsigned long sctlr_save;
+static int mmu_enabled;
+
+/* Invalidate TLB */
+void my_v7_inval_tlb(void)
+{
+	/* Invalidate entire unified TLB */
+	asm volatile ("mcr p15, 0, %0, c8, c7, 0" : : "r" (0));
+	/* Invalidate entire data TLB */
+	asm volatile ("mcr p15, 0, %0, c8, c6, 0" : : "r" (0));
+	/* Invalidate entire instruction TLB */
+	asm volatile ("mcr p15, 0, %0, c8, c5, 0" : : "r" (0));
+	/* Full system DSB - make sure that the invalidation is complete */
+	CP15DSB;
+	/* Full system ISB - make sure the instruction stream sees it */
+	CP15ISB;
+}
+
+static unsigned long enable_mmu(unsigned long long *ttbr0)
+{
+	unsigned long ret;
+	asm (
+		"stmfd	r13!, {r10, r11}\n"
+		/* set ttbr0			*/
+		"mov	r10, %1\n"
+		"mov	r11, #0\n"
+		"mcrr	p15, 0, r10, r11, c2\n"
+		/* ttbcr = 0x80000000		*/
+		"mov	r10, #0\n"
+		"orr	r10, r10, #(1 << 31)\n"
+		"mcr	p15, 0, r10, c2, c0, 2\n"
+		/* save current SCTLR value	*/
+		"mrc	p15, #0, r10, c1, c0, #0\n"
+		"mov	%0, r10\n"
+		/* disable cache		*/
+		"bic	r10, r10,#(1 << 12)\n"
+		"bic	r10, r10,#(1 <<  2)\n"
+		"mcr	p15, #0, r10, c1, c0, #0\n"
+		"isb\n"
+		"dsb\n"
+		"bl	invalidate_dcache_all\n"
+		"bl	my_v7_inval_tlb\n"
+		/* enable mmu			*/
+		"mrc	p15, #0, r10, c1, c0, #0\n"
+		"orr	r10, r10,#1\n"
+		"mcr	p15, #0, r10, c1, c0, #0\n"
+		"ldmfd	r13!, {r10, r11}\n"
+		: "=r" (ret) : "r" (ttbr0) : "r10", "r11", "cc"
+	);
+
+	return ret;
+}
+
+static void disable_mmu(unsigned long sctlr_old)
+{
+	asm volatile (
+		"mov	r10, %0\n"
+		"bic	r10, r10,#1\n"
+		"mcr	p15, #0, r10, c1, c0, #0\n"
+		: : "r" (sctlr_old) : "r10", "cc"
+	       );
+}
+
+
+static void pgd_table_init(void)
+{
+	/*
+	 * we create identical mapping for the whole 4GB address range
+	 * this table maps 0x0-0xffffffff VA to aliased PA range
+	 * 0x0_0000_0000 - 0x0_ffff_ffff;
+	 */
+
+	pgd_table[0] = 0x000000000000071dULL;
+	pgd_table[1] = 0x000000004000071dULL;
+	pgd_table[2] = 0x000000008000071dULL;
+	pgd_table[3] = 0x00000000c000071dULL;
+}
+
+int do_highmem_cmd(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
+{
+	unsigned long	pgd2_pa;
+	unsigned long long pgd_val;
+	int j;
+
+	if (argc < 2)
+		goto highmem_cmd_usage;
+
+	if (strcmp(argv[1], "mmuon") == 0) {
+		if (mmu_enabled) {
+			printf("MMU already enabled\n");
+		} else {
+			pgd_table_init();
+			sctlr_save = enable_mmu(pgd_table);
+			mmu_enabled = 1;
+			printf("MMU enabled\n");
+		}
+	} else if (strcmp(argv[1], "mmuoff") == 0) {
+		if (mmu_enabled == 0) {
+			printf("MMU already disabled\n");
+		} else {
+			disable_mmu(sctlr_save);
+			mmu_enabled = 0;
+			printf("MMU disabled\n");
+		}
+	} else if (strcmp(argv[1], "pgd2") == 0) {
+		if (argc == 3) {
+			pgd2_pa = simple_strtoul(argv[2], NULL, 16);
+			pgd_val = pgd2_pa;
+			pgd_val <<= 4;
+			pgd_val |= 0x71dull;
+			pgd_table[2] = pgd_val;
+			my_v7_inval_tlb();
+		}
+		for (j = 0; j < 4; j++)
+			printf("pgd%d - 0x%016llX\n", j, pgd_table[j]);
+	} else {
+		goto highmem_cmd_usage;
+	}
+
+	return 0;
+
+highmem_cmd_usage:
+	return cmd_usage(cmdtp);
+}
+
+U_BOOT_CMD(
+	highmem,	3,	0,	do_highmem_cmd,
+	"highmem test",
+	"highmem <mmuon|mmuoff|pgd2> [<pgd2_pa >> 4> in hex]\n"
+);
+
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 3+ messages in thread

* [U-Boot] [PATCH] keystone2: add high memory test
  2015-07-08 15:51 [U-Boot] [PATCH] keystone2: add high memory test Vitaly Andrianov
@ 2015-07-21 21:28 ` Tom Rini
  2015-07-22 11:41   ` Vitaly Andrianov
  0 siblings, 1 reply; 3+ messages in thread
From: Tom Rini @ 2015-07-21 21:28 UTC (permalink / raw)
  To: u-boot

On Wed, Jul 08, 2015 at 11:51:39AM -0400, Vitaly Andrianov wrote:

> Keystone2 SOC physical DDR3 address range is outside the first 4GB and
> cannot be entirely accessible without MMU enabled. Only first 2GB of
> the physical memory have 32-bits aliased addresses. This patch adds u-boot
> shell command that allows to enable/disable MMU and map the 1GB of
> 36bits physical memory to the first 4GB address range.
> 
> Signed-off-by: Vitaly Andrianov <vitalya@ti.com>
> ---
>  arch/arm/mach-keystone/Makefile  |   3 +-
>  arch/arm/mach-keystone/highmem.c | 162 +++++++++++++++++++++++++++++++++++++++
>  2 files changed, 164 insertions(+), 1 deletion(-)
>  create mode 100644 arch/arm/mach-keystone/highmem.c

The code looks reasonable.  But why do we need this?  Thanks.

-- 
Tom
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 836 bytes
Desc: Digital signature
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20150721/acb55c99/attachment.sig>

^ permalink raw reply	[flat|nested] 3+ messages in thread

* [U-Boot] [PATCH] keystone2: add high memory test
  2015-07-21 21:28 ` Tom Rini
@ 2015-07-22 11:41   ` Vitaly Andrianov
  0 siblings, 0 replies; 3+ messages in thread
From: Vitaly Andrianov @ 2015-07-22 11:41 UTC (permalink / raw)
  To: u-boot



On 07/21/2015 05:28 PM, Tom Rini wrote:
> On Wed, Jul 08, 2015 at 11:51:39AM -0400, Vitaly Andrianov wrote:
>
>> Keystone2 SOC physical DDR3 address range is outside the first 4GB and
>> cannot be entirely accessible without MMU enabled. Only first 2GB of
>> the physical memory have 32-bits aliased addresses. This patch adds u-boot
>> shell command that allows to enable/disable MMU and map the 1GB of
>> 36bits physical memory to the first 4GB address range.
>>
>> Signed-off-by: Vitaly Andrianov <vitalya@ti.com>
>> ---
>>   arch/arm/mach-keystone/Makefile  |   3 +-
>>   arch/arm/mach-keystone/highmem.c | 162 +++++++++++++++++++++++++++++++++++++++
>>   2 files changed, 164 insertions(+), 1 deletion(-)
>>   create mode 100644 arch/arm/mach-keystone/highmem.c
>
> The code looks reasonable.  But why do we need this?  Thanks.
>
Tom,

I added this code to test DDR3 configuration. Probably you are right. 
After configuration is done we don't need this code.

Thanks,
-Vitaly

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2015-07-22 11:41 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-07-08 15:51 [U-Boot] [PATCH] keystone2: add high memory test Vitaly Andrianov
2015-07-21 21:28 ` Tom Rini
2015-07-22 11:41   ` Vitaly Andrianov

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox