[U-Boot-Users] [Patch 10/17] U-Boot-V2:ARM:OMAP3: Add support for OMAP and Cortex A8

5 messages, 2 authors, 2008-06-04 · open the first message on its own page

[U-Boot-Users] [Patch 10/17] U-Boot-V2:ARM:OMAP3: Add support for OMAP and Cortex A8

From: Menon, Nishanth <x0nishan@ti.com>
Date: 2008-05-21 16:28:55

This patch adds support for OMAP3 platforms. This is mainly to setup the infrastructure. ARMV7 requires a different I/D cache cleanup code which is introduced in this patch.

Thanks to Laurent in pointing out the Cortex-A8 D-Cache issue with my first rev patch.

Signed-off-by: Nishanth Menon<redacted>

---
 arch/arm/Kconfig         |   24 ++++++++++++++++++++
 arch/arm/Makefile        |    6 +++++
 arch/arm/cpu/Makefile    |    1 
 arch/arm/cpu/start-arm.S |   54 +++++++++++++++++++++++++++++++++++++++++++++++
 4 files changed, 84 insertions(+), 1 deletion(-)

Index: u-boot-v2.git/arch/arm/Kconfig
===================================================================
--- u-boot-v2.git.orig/arch/arm/Kconfig	2008-05-20 18:20:54.000000000 -0500
+++ u-boot-v2.git/arch/arm/Kconfig	2008-05-21 10:41:17.000000000 -0500
@@ -47,6 +47,9 @@
 config ARM926EJS
 	bool
 
+config ARMCORTEXA8
+	bool
+
 # i.MX1, i.MXL, i.MX27 and i.MX31 are quite similar and thus
 # handled in one arch
 config ARCH_IMX
@@ -74,6 +77,10 @@
 	bool
 	select ARM926EJS
 
+config ARCH_OMAP
+	bool
+# ARM versions used varies on based on OMAP versions
+
 choice
 	prompt "Select your board"
 
@@ -135,6 +142,13 @@
 	  Say Y here if your are using Phytec's phyCORE-i.MX31 (pcm037) equipped
 	  with a Freescale i.MX31 Processor
 
+config MACH_OMAP
+	bool "Texas Instruments' OMAP based platforms"
+	select ARCH_OMAP
+	select MACH_CAN_MODIFY_MALLOC_START
+	help
+	  Say Y if you are using Texas Instrument's OMAP based platforms
+
 endchoice
 
 config IMX_CLKO
@@ -144,8 +158,9 @@
 	  The i.MX SoCs have a Pin which can output different reference frequencies.
 	  Say y here if you want to have the clko command which lets you select the
 	  frequency to output on this pin.
-	  
+
 source arch/arm/mach-netx/Kconfig
+source arch/arm/mach-omap/Kconfig
 
 menu "Arm specific settings         "
 
@@ -190,6 +205,13 @@
 	  Provide the alternate malloc start address. Remember that the area
 	  that will be used will be (this address) to (this address - CFG_MALLOC_LEN - CONFIG_STACKSIZE)
 
+config ARMCORTEXA8_DCACHE_SKIP
+	bool "Skip DCache Invlidate"
+	depends on ARMCORTEXA8
+	default n
+	help
+	  If your architecture configuration uses some other method of disabling caches, enable this
+	  So that the D-Cache invalidation logic is skipped
 endmenu
 
 source common/Kconfig
Index: u-boot-v2.git/arch/arm/Makefile
===================================================================
--- u-boot-v2.git.orig/arch/arm/Makefile	2008-05-20 18:20:54.000000000 -0500
+++ u-boot-v2.git/arch/arm/Makefile	2008-05-20 18:20:54.000000000 -0500
@@ -6,6 +6,7 @@
 machine-$(CONFIG_ARCH_IMX)	   := imx
 machine-$(CONFIG_ARCH_NETX)	   := netx
 machine-$(CONFIG_ARCH_AT91RM9200)  := at91rm9200
+machine-$(CONFIG_ARCH_OMAP)        := omap
 board-$(CONFIG_MACH_MX1ADS)	   := mx1ads
 board-$(CONFIG_MACH_ECO920)	   := eco920
 board-$(CONFIG_MACH_SCB9328)	   := scb9328
@@ -13,6 +14,7 @@
 board-$(CONFIG_MACH_IMX27ADS)	   := imx27ads
 board-$(CONFIG_MACH_NXDB500)       := netx
 board-$(CONFIG_MACH_PCM037)	   := pcm037
+board-$(CONFIG_MACH_OMAP)	   := omap
 # FIXME "cpu-y" never used on ARM!
 cpu-$(CONFIG_ARM920T)              := arm920t
 cpu-$(CONFIG_ARM926EJS)            := arm926ejs
@@ -22,6 +24,10 @@
 CPPFLAGS += -mabi=apcs-gnu -DTEXT_BASE=$(TEXT_BASE) -P
 CFLAGS += -Os
 
+# Add architecture specific flags
+ifeq ($(CONFIG_ARMCORTEXA8),y)
+CPPFLAGS += -march=armv7a
+endif
 
 # Add cleanup flags
 CPPFLAGS += -fdata-sections -ffunction-sections
Index: u-boot-v2.git/arch/arm/cpu/Makefile
===================================================================
--- u-boot-v2.git.orig/arch/arm/cpu/Makefile	2008-05-20 18:18:43.000000000 -0500
+++ u-boot-v2.git/arch/arm/cpu/Makefile	2008-05-20 18:20:54.000000000 -0500
@@ -6,4 +6,5 @@
 #
 obj-$(CONFIG_ARM920T) += start-arm.o
 obj-$(CONFIG_ARM926EJS) += start-arm.o
+obj-$(CONFIG_ARMCORTEXA8) += start-arm.o
 obj-$(CONFIG_ARCH_IMX31) += start-arm.o
Index: u-boot-v2.git/arch/arm/cpu/start-arm.S
===================================================================
--- u-boot-v2.git.orig/arch/arm/cpu/start-arm.S	2008-05-20 18:20:54.000000000 -0500
+++ u-boot-v2.git/arch/arm/cpu/start-arm.S	2008-05-21 10:44:14.000000000 -0500
@@ -143,12 +143,66 @@
 #ifdef CONFIG_ARCH_HAS_LOWLEVEL_INIT
 	bl arch_init_lowlevel
 #endif
+
+#ifdef CONFIG_ARMCORTEXA8
+	/*
+	 * Invalidate v7 I/D caches
+	 */
+	mov     r0, #0                 /* set up for MCR */
+	mcr     p15, 0, r0, c8, c7, 0  /* invalidate TLBs */
+	mcr     p15, 0, r0, c7, c5, 0  /* invalidate icache */
+	/* Invalidate all Dcaches */
+#ifndef CONFIG_ARMCORTEXA8_DCACHE_SKIP
+	/* If Arch specific ROM code SMI handling does not exist */
+	mrc	p15, 1, r0, c0, c0, 1	/* read clidr */
+	ands	r3, r0, #0x7000000	/* extract loc from clidr */
+	mov	r3, r3, lsr #23		/* left align loc bit field */
+	beq	finished_inval	/* if loc is 0, then no need to clean */
+	mov	r10, #0			/* start clean at cache level 0 */
+inval_loop1:
+	add	r2, r10, r10, lsr #1	/* work out 3x current cache level */
+	mov	r1, r0, lsr r2	/* extract cache type bits from clidr */
+	and	r1, r1, #7	/* mask of the bits for current cache only */
+	cmp	r1, #2		/* see what cache we have at this level */
+	blt	skip_inval		/* skip if no cache, or just i-cache */
+	mcr	p15, 2, r10, c0, c0, 0	/* select current cache level in cssr */
+	isb				/* isb to sych the new cssr&csidr */
+	mrc	p15, 1, r1, c0, c0, 0	/* read the new csidr */
+	and	r2, r1, #7	  /* extract the length of the cache lines */
+	add	r2, r2, #4		/* add 4 (line length offset) */
+	ldr	r4, =0x3ff
+	ands	r4, r4, r1, lsr #3	/* find maximum number on the way size*/
+	clz	r5, r4		/* find bit position of way size increment */
+	ldr	r7, =0x7fff
+	ands	r7, r7, r1, lsr #13 /* extract max number of the index size */
+inval_loop2:
+	mov	r9, r4		/* create working copy of max way size */
+inval_loop3:
+	orr	r11, r10, r9, lsl r5  /* factor way and cache number into r11*/
+	orr	r11, r11, r7, lsl r2	/* factor index number into r11 */
+	mcr	p15, 0, r11, c7, c6, 2	/* invalidate by set/way */
+	subs	r9, r9, #1		/* decrement the way */
+	bge	inval_loop3
+	subs	r7, r7, #1		/* decrement the index */
+	bge	inval_loop2
+skip_inval:
+	add	r10, r10, #2		/* increment cache number */
+	cmp	r3, r10
+	bgt	inval_loop1
+finished_inval:
+	mov	r10, #0			/* swith back to cache level 0 */
+	mcr	p15, 2, r10, c0, c0, 0	/* select current cache level in cssr */
+	isb
+#endif /* CONFIG_ARMCORTEXA8_DCACHE_SKIP */
+
+#else
 	/*
 	 * flush v4 I/D caches
 	 */
 	mov	r0, #0
 	mcr	p15, 0, r0, c7, c7, 0	/* flush v3/v4 cache */
 	mcr	p15, 0, r0, c8, c7, 0	/* flush v4 TLB */
+#endif
 
 	/*
 	 * disable MMU stuff and caches

[U-Boot-Users] [Patch 10/17] U-Boot-V2:ARM:OMAP3: Add support for OMAP and Cortex A8

From: Sascha Hauer <s.hauer@pengutronix.de>
Date: 2008-06-03 08:12:22

On Wed, May 21, 2008 at 11:28:55AM -0500, Menon, Nishanth wrote:
quoted hunk
This patch adds support for OMAP3 platforms. This is mainly to setup the infrastructure. ARMV7 requires a different I/D cache cleanup code which is introduced in this patch.

Thanks to Laurent in pointing out the Cortex-A8 D-Cache issue with my first rev patch.

Signed-off-by: Nishanth Menon<redacted>

---
 arch/arm/Kconfig         |   24 ++++++++++++++++++++
 arch/arm/Makefile        |    6 +++++
 arch/arm/cpu/Makefile    |    1 
 arch/arm/cpu/start-arm.S |   54 +++++++++++++++++++++++++++++++++++++++++++++++
 4 files changed, 84 insertions(+), 1 deletion(-)

Index: u-boot-v2.git/arch/arm/Kconfig
===================================================================
--- u-boot-v2.git.orig/arch/arm/Kconfig	2008-05-20 18:20:54.000000000 -0500
+++ u-boot-v2.git/arch/arm/Kconfig	2008-05-21 10:41:17.000000000 -0500
@@ -47,6 +47,9 @@
 config ARM926EJS
 	bool
 
+config ARMCORTEXA8
+	bool
+
 # i.MX1, i.MXL, i.MX27 and i.MX31 are quite similar and thus
 # handled in one arch
 config ARCH_IMX
@@ -74,6 +77,10 @@
 	bool
 	select ARM926EJS
 
+config ARCH_OMAP
+	bool
+# ARM versions used varies on based on OMAP versions
+
 choice
 	prompt "Select your board"
 
@@ -135,6 +142,13 @@
 	  Say Y here if your are using Phytec's phyCORE-i.MX31 (pcm037) equipped
 	  with a Freescale i.MX31 Processor
 
+config MACH_OMAP
+	bool "Texas Instruments' OMAP based platforms"
+	select ARCH_OMAP
+	select MACH_CAN_MODIFY_MALLOC_START
+	help
+	  Say Y if you are using Texas Instrument's OMAP based platforms
+
 endchoice
 
 config IMX_CLKO
@@ -144,8 +158,9 @@
 	  The i.MX SoCs have a Pin which can output different reference frequencies.
 	  Say y here if you want to have the clko command which lets you select the
 	  frequency to output on this pin.
-	  
+
 source arch/arm/mach-netx/Kconfig
+source arch/arm/mach-omap/Kconfig
 
 menu "Arm specific settings         "
 
@@ -190,6 +205,13 @@
 	  Provide the alternate malloc start address. Remember that the area
 	  that will be used will be (this address) to (this address - CFG_MALLOC_LEN - CONFIG_STACKSIZE)
 
+config ARMCORTEXA8_DCACHE_SKIP
+	bool "Skip DCache Invlidate"
+	depends on ARMCORTEXA8
+	default n
+	help
+	  If your architecture configuration uses some other method of disabling caches, enable this
+	  So that the D-Cache invalidation logic is skipped
 endmenu
 
 source common/Kconfig
Index: u-boot-v2.git/arch/arm/Makefile
===================================================================
--- u-boot-v2.git.orig/arch/arm/Makefile	2008-05-20 18:20:54.000000000 -0500
+++ u-boot-v2.git/arch/arm/Makefile	2008-05-20 18:20:54.000000000 -0500
@@ -6,6 +6,7 @@
 machine-$(CONFIG_ARCH_IMX)	   := imx
 machine-$(CONFIG_ARCH_NETX)	   := netx
 machine-$(CONFIG_ARCH_AT91RM9200)  := at91rm9200
+machine-$(CONFIG_ARCH_OMAP)        := omap
 board-$(CONFIG_MACH_MX1ADS)	   := mx1ads
 board-$(CONFIG_MACH_ECO920)	   := eco920
 board-$(CONFIG_MACH_SCB9328)	   := scb9328
@@ -13,6 +14,7 @@
 board-$(CONFIG_MACH_IMX27ADS)	   := imx27ads
 board-$(CONFIG_MACH_NXDB500)       := netx
 board-$(CONFIG_MACH_PCM037)	   := pcm037
+board-$(CONFIG_MACH_OMAP)	   := omap
 # FIXME "cpu-y" never used on ARM!
 cpu-$(CONFIG_ARM920T)              := arm920t
 cpu-$(CONFIG_ARM926EJS)            := arm926ejs
@@ -22,6 +24,10 @@
 CPPFLAGS += -mabi=apcs-gnu -DTEXT_BASE=$(TEXT_BASE) -P
 CFLAGS += -Os
 
+# Add architecture specific flags
+ifeq ($(CONFIG_ARMCORTEXA8),y)
+CPPFLAGS += -march=armv7a
+endif
 
 # Add cleanup flags
 CPPFLAGS += -fdata-sections -ffunction-sections
Index: u-boot-v2.git/arch/arm/cpu/Makefile
===================================================================
--- u-boot-v2.git.orig/arch/arm/cpu/Makefile	2008-05-20 18:18:43.000000000 -0500
+++ u-boot-v2.git/arch/arm/cpu/Makefile	2008-05-20 18:20:54.000000000 -0500
@@ -6,4 +6,5 @@
 #
 obj-$(CONFIG_ARM920T) += start-arm.o
 obj-$(CONFIG_ARM926EJS) += start-arm.o
+obj-$(CONFIG_ARMCORTEXA8) += start-arm.o
 obj-$(CONFIG_ARCH_IMX31) += start-arm.o
Index: u-boot-v2.git/arch/arm/cpu/start-arm.S
===================================================================
--- u-boot-v2.git.orig/arch/arm/cpu/start-arm.S	2008-05-20 18:20:54.000000000 -0500
+++ u-boot-v2.git/arch/arm/cpu/start-arm.S	2008-05-21 10:44:14.000000000 -0500
@@ -143,12 +143,66 @@
 #ifdef CONFIG_ARCH_HAS_LOWLEVEL_INIT
 	bl arch_init_lowlevel
 #endif
+
+#ifdef CONFIG_ARMCORTEXA8
+	/*
+	 * Invalidate v7 I/D caches
+	 */
+	mov     r0, #0                 /* set up for MCR */
+	mcr     p15, 0, r0, c8, c7, 0  /* invalidate TLBs */
+	mcr     p15, 0, r0, c7, c5, 0  /* invalidate icache */
+	/* Invalidate all Dcaches */
+#ifndef CONFIG_ARMCORTEXA8_DCACHE_SKIP
+	/* If Arch specific ROM code SMI handling does not exist */
+	mrc	p15, 1, r0, c0, c0, 1	/* read clidr */
+	ands	r3, r0, #0x7000000	/* extract loc from clidr */
+	mov	r3, r3, lsr #23		/* left align loc bit field */
+	beq	finished_inval	/* if loc is 0, then no need to clean */
+	mov	r10, #0			/* start clean at cache level 0 */
+inval_loop1:
+	add	r2, r10, r10, lsr #1	/* work out 3x current cache level */
+	mov	r1, r0, lsr r2	/* extract cache type bits from clidr */
+	and	r1, r1, #7	/* mask of the bits for current cache only */
+	cmp	r1, #2		/* see what cache we have at this level */
+	blt	skip_inval		/* skip if no cache, or just i-cache */
+	mcr	p15, 2, r10, c0, c0, 0	/* select current cache level in cssr */
+	isb				/* isb to sych the new cssr&csidr */
+	mrc	p15, 1, r1, c0, c0, 0	/* read the new csidr */
+	and	r2, r1, #7	  /* extract the length of the cache lines */
+	add	r2, r2, #4		/* add 4 (line length offset) */
+	ldr	r4, =0x3ff
+	ands	r4, r4, r1, lsr #3	/* find maximum number on the way size*/
+	clz	r5, r4		/* find bit position of way size increment */
+	ldr	r7, =0x7fff
+	ands	r7, r7, r1, lsr #13 /* extract max number of the index size */
+inval_loop2:
+	mov	r9, r4		/* create working copy of max way size */
+inval_loop3:
+	orr	r11, r10, r9, lsl r5  /* factor way and cache number into r11*/
+	orr	r11, r11, r7, lsl r2	/* factor index number into r11 */
+	mcr	p15, 0, r11, c7, c6, 2	/* invalidate by set/way */
+	subs	r9, r9, #1		/* decrement the way */
+	bge	inval_loop3
+	subs	r7, r7, #1		/* decrement the index */
+	bge	inval_loop2
+skip_inval:
+	add	r10, r10, #2		/* increment cache number */
+	cmp	r3, r10
+	bgt	inval_loop1
+finished_inval:
+	mov	r10, #0			/* swith back to cache level 0 */
+	mcr	p15, 2, r10, c0, c0, 0	/* select current cache level in cssr */
+	isb
+#endif /* CONFIG_ARMCORTEXA8_DCACHE_SKIP */
Is this really ARMCORTEX specific or arm v7 specific? Anyway, this looks
like the start of another ifdef mess, we should create some generic hook
here.

Sascha
quoted hunk
+
+#else
 	/*
 	 * flush v4 I/D caches
 	 */
 	mov	r0, #0
 	mcr	p15, 0, r0, c7, c7, 0	/* flush v3/v4 cache */
 	mcr	p15, 0, r0, c8, c7, 0	/* flush v4 TLB */
+#endif
 
 	/*
 	 * disable MMU stuff and caches
-- 
Pengutronix e.K. - Linux Solutions for Science and Industry
-----------------------------------------------------------
Kontakt-Informationen finden Sie im Header dieser Mail oder
auf der Webseite -> http://www.pengutronix.de/impressum/ <-

[U-Boot-Users] [Patch 10/17] U-Boot-V2:ARM:OMAP3: Add support for OMAP and Cortex A8

From: Laurent Desnogues <hidden>
Date: 2008-06-03 08:22:46

On Tue, Jun 3, 2008 at 10:12 AM, Sascha Hauer [off-list ref] wrote:
Is this really ARMCORTEX specific or arm v7 specific?
This is not Cortex A8 specific, it's v7-A (and hopefully will be the same
in upcoming ARM architectures).
Anyway, this looks
like the start of another ifdef mess, we should create some generic hook
here.
You could perhaps mimic the way the Linux kernel handles cache stuff
for the various ARM architectures.


Laurent

[U-Boot-Users] [Patch 10/17] U-Boot-V2:ARM:OMAP3: Add support for OMAP and Cortex A8

From: Menon, Nishanth <x0nishan@ti.com>
Date: 2008-06-03 15:38:27

-----Original Message-----
From: Laurent Desnogues [mailto:laurent.desnogues at gmail.com]
Sent: Tuesday, June 03, 2008 3:23 AM
To: Menon, Nishanth; u-boot-users at lists.sourceforge.net; Laurent Desnogues;
dirk.behme at googlemail.com; philip.balister at gmail.com; Gopinath, Thara; Kamat, Nishant; Syed Mohammed,
Khasim
Subject: Re: [Patch 10/17] U-Boot-V2:ARM:OMAP3: Add support for OMAP and Cortex A8

On Tue, Jun 3, 2008 at 10:12 AM, Sascha Hauer [off-list ref] wrote:
quoted
Is this really ARMCORTEX specific or arm v7 specific?
This is not Cortex A8 specific, it's v7-A (and hopefully will be the same
in upcoming ARM architectures).
Probably ARM arch definitions need to be cleaned up a bit more? Granularity is restricted today to ARM CPU and not architecture..
quoted
Anyway, this looks
like the start of another ifdef mess, we should create some generic hook
here.
You could perhaps mimic the way the Linux kernel handles cache stuff
for the various ARM architectures.
Probably not the extent.. but yes to a lesser extent might be helpful. Common code will still exist, probably CP15 stuff can move out?

Regards,
Nishanth Menon

[U-Boot-Users] [Patch 10/17 Try 2] U-Boot-V2:ARM:OMAP3: Add support for OMAP and Cortex A8

From: Menon, Nishanth <x0nishan@ti.com>
Date: 2008-06-04 05:06:26

Sascha,
-----Original Message-----
From: Menon, Nishanth
Sent: Tuesday, June 03, 2008 10:38 AM
To: 'Laurent Desnogues'; u-boot-users at lists.sourceforge.net; dirk.behme at googlemail.com;
philip.balister at gmail.com; Gopinath, Thara; Kamat, Nishant; Syed Mohammed, Khasim
Subject: RE: [Patch 10/17] U-Boot-V2:ARM:OMAP3: Add support for OMAP and Cortex A8
quoted
-----Original Message-----
From: Laurent Desnogues [mailto:laurent.desnogues at gmail.com]
Sent: Tuesday, June 03, 2008 3:23 AM
To: Menon, Nishanth; u-boot-users at lists.sourceforge.net; Laurent Desnogues;
dirk.behme at googlemail.com; philip.balister at gmail.com; Gopinath, Thara; Kamat, Nishant; Syed
Subject: Re: [Patch 10/17] U-Boot-V2:ARM:OMAP3: Add support for OMAP and Cortex A8

On Tue, Jun 3, 2008 at 10:12 AM, Sascha Hauer [off-list ref] wrote:
quoted
Is this really ARMCORTEX specific or arm v7 specific?
This is not Cortex A8 specific, it's v7-A (and hopefully will be the same
in upcoming ARM architectures).
Probably ARM arch definitions need to be cleaned up a bit more? Granularity is restricted today to
ARM CPU and not architecture..
quoted
quoted
Anyway, this looks
like the start of another ifdef mess, we should create some generic hook
here.
You could perhaps mimic the way the Linux kernel handles cache stuff
for the various ARM architectures.
Probably not the extent.. but yes to a lesser extent might be helpful. Common code will still exist,
probably CP15 stuff can move out?
Keeping the current code, but resyncing based on MALLOC changes. Need clean up of ARM proc specific changes pretty soon I guess. ARMV4, V6, V7 support to be independent of common code.

Signed-off-by: Nishanth Menon<redacted>

---
 arch/arm/Kconfig         |   23 +++++++++++++++++++-
 arch/arm/Makefile        |    6 +++++
 arch/arm/cpu/Makefile    |    1
 arch/arm/cpu/start-arm.S |   54 +++++++++++++++++++++++++++++++++++++++++++++++
 4 files changed, 83 insertions(+), 1 deletion(-)

Index: u-boot.v2/arch/arm/Kconfig
===================================================================
--- u-boot.v2.orig/arch/arm/Kconfig     2008-06-03 20:27:47.000000000 -0500
+++ u-boot.v2/arch/arm/Kconfig  2008-06-03 20:45:08.000000000 -0500
@@ -47,6 +47,9 @@
 config ARM926EJS
        bool

+config ARMCORTEXA8
+       bool
+
 # i.MX1, i.MXL, i.MX27 and i.MX31 are quite similar and thus
 # handled in one arch
 config ARCH_IMX
@@ -74,6 +77,10 @@
        bool
        select ARM926EJS

+config ARCH_OMAP
+       bool
+# ARM versions used varies on based on OMAP versions
+
 choice
        prompt "Select your board"
@@ -135,6 +142,12 @@
          Say Y here if your are using Phytec's phyCORE-i.MX31 (pcm037) equipped
          with a Freescale i.MX31 Processor

+config MACH_OMAP
+       bool "Texas Instruments' OMAP based platforms"
+       select ARCH_OMAP
+       help
+         Say Y if you are using Texas Instrument's OMAP based platforms
+
 endchoice

 config IMX_CLKO
@@ -144,8 +157,9 @@
          The i.MX SoCs have a Pin which can output different reference frequencies.
          Say y here if you want to have the clko command which lets you select the
          frequency to output on this pin.
-
+
 source arch/arm/mach-netx/Kconfig
+source arch/arm/mach-omap/Kconfig

 menu "Arm specific settings         "
@@ -168,6 +182,13 @@
          If you want to start a 2.6 kernel and use an
          initrd image say y here.

+config ARMCORTEXA8_DCACHE_SKIP
+       bool "Skip DCache Invlidate"
+       depends on ARMCORTEXA8
+       default n
+       help
+         If your architecture configuration uses some other method of disabling caches, enable this
+         So that the D-Cache invalidation logic is skipped
 endmenu

 source common/Kconfig
Index: u-boot.v2/arch/arm/Makefile
===================================================================
--- u-boot.v2.orig/arch/arm/Makefile    2008-06-03 20:28:20.000000000 -0500
+++ u-boot.v2/arch/arm/Makefile 2008-06-03 20:42:53.000000000 -0500
@@ -5,6 +5,7 @@
 machine-$(CONFIG_ARCH_IMX)        := imx
 machine-$(CONFIG_ARCH_NETX)       := netx
 machine-$(CONFIG_ARCH_AT91RM9200)  := at91rm9200
+machine-$(CONFIG_ARCH_OMAP)        := omap
 board-$(CONFIG_MACH_MX1ADS)       := mx1ads
 board-$(CONFIG_MACH_ECO920)       := eco920
 board-$(CONFIG_MACH_SCB9328)      := scb9328
@@ -12,6 +13,7 @@
 board-$(CONFIG_MACH_IMX27ADS)     := imx27ads
 board-$(CONFIG_MACH_NXDB500)       := netx
 board-$(CONFIG_MACH_PCM037)       := pcm037
+board-$(CONFIG_MACH_OMAP)         := omap
 # FIXME "cpu-y" never used on ARM!
 cpu-$(CONFIG_ARM920T)              := arm920t
 cpu-$(CONFIG_ARM926EJS)            := arm926ejs
@@ -70,6 +72,10 @@
 PHONY += maketools
 maketools: include/asm-arm/.arch

+# Add architecture specific flags
+ifeq ($(CONFIG_ARMCORTEXA8),y)
+CPPFLAGS += -march=armv7a
+endif

 ifneq ($(board-y),)
 BOARD  := board/$(board-y)/
Index: u-boot.v2/arch/arm/cpu/Makefile
===================================================================
--- u-boot.v2.orig/arch/arm/cpu/Makefile        2008-06-03 20:27:44.000000000 -0500
+++ u-boot.v2/arch/arm/cpu/Makefile     2008-06-03 20:42:53.000000000 -0500
@@ -6,4 +6,5 @@
 #
 obj-$(CONFIG_ARM920T) += start-arm.o
 obj-$(CONFIG_ARM926EJS) += start-arm.o
+obj-$(CONFIG_ARMCORTEXA8) += start-arm.o
 obj-$(CONFIG_ARCH_IMX31) += start-arm.o
Index: u-boot.v2/arch/arm/cpu/start-arm.S
===================================================================
--- u-boot.v2.orig/arch/arm/cpu/start-arm.S     2008-06-03 20:42:42.000000000 -0500
+++ u-boot.v2/arch/arm/cpu/start-arm.S  2008-06-03 20:42:53.000000000 -0500
@@ -157,12 +157,66 @@
 #ifdef CONFIG_ARCH_HAS_LOWLEVEL_INIT
        bl arch_init_lowlevel
 #endif
+
+#ifdef CONFIG_ARMCORTEXA8
+       /*
+        * Invalidate v7 I/D caches
+        */
+       mov     r0, #0                 /* set up for MCR */
+       mcr     p15, 0, r0, c8, c7, 0  /* invalidate TLBs */
+       mcr     p15, 0, r0, c7, c5, 0  /* invalidate icache */
+       /* Invalidate all Dcaches */
+#ifndef CONFIG_ARMCORTEXA8_DCACHE_SKIP
+       /* If Arch specific ROM code SMI handling does not exist */
+       mrc     p15, 1, r0, c0, c0, 1   /* read clidr */
+       ands    r3, r0, #0x7000000      /* extract loc from clidr */
+       mov     r3, r3, lsr #23         /* left align loc bit field */
+       beq     finished_inval  /* if loc is 0, then no need to clean */
+       mov     r10, #0                 /* start clean at cache level 0 */
+inval_loop1:
+       add     r2, r10, r10, lsr #1    /* work out 3x current cache level */
+       mov     r1, r0, lsr r2  /* extract cache type bits from clidr */
+       and     r1, r1, #7      /* mask of the bits for current cache only */
+       cmp     r1, #2          /* see what cache we have at this level */
+       blt     skip_inval              /* skip if no cache, or just i-cache */
+       mcr     p15, 2, r10, c0, c0, 0  /* select current cache level in cssr */
+       isb                             /* isb to sych the new cssr&csidr */
+       mrc     p15, 1, r1, c0, c0, 0   /* read the new csidr */
+       and     r2, r1, #7        /* extract the length of the cache lines */
+       add     r2, r2, #4              /* add 4 (line length offset) */
+       ldr     r4, =0x3ff
+       ands    r4, r4, r1, lsr #3      /* find maximum number on the way size*/
+       clz     r5, r4          /* find bit position of way size increment */
+       ldr     r7, =0x7fff
+       ands    r7, r7, r1, lsr #13 /* extract max number of the index size */
+inval_loop2:
+       mov     r9, r4          /* create working copy of max way size */
+inval_loop3:
+       orr     r11, r10, r9, lsl r5  /* factor way and cache number into r11*/
+       orr     r11, r11, r7, lsl r2    /* factor index number into r11 */
+       mcr     p15, 0, r11, c7, c6, 2  /* invalidate by set/way */
+       subs    r9, r9, #1              /* decrement the way */
+       bge     inval_loop3
+       subs    r7, r7, #1              /* decrement the index */
+       bge     inval_loop2
+skip_inval:
+       add     r10, r10, #2            /* increment cache number */
+       cmp     r3, r10
+       bgt     inval_loop1
+finished_inval:
+       mov     r10, #0                 /* swith back to cache level 0 */
+       mcr     p15, 2, r10, c0, c0, 0  /* select current cache level in cssr */
+       isb
+#endif /* CONFIG_ARMCORTEXA8_DCACHE_SKIP */
+
+#else
        /*
         * flush v4 I/D caches
         */
        mov     r0, #0
        mcr     p15, 0, r0, c7, c7, 0   /* flush v3/v4 cache */
        mcr     p15, 0, r0, c8, c7, 0   /* flush v4 TLB */
+#endif

        /*
         * disable MMU stuff and caches
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help