Skip to contentSkip to conversation

tegra2: move tegra2 SoC code to arch/arm/cpu/tegra2-common

PATCH New Allen Martin 2 participants 8 messages Apr 18, 2012 – Jun 10, 2012

Subsystems (4)
lore
Share & tools
lore
#0 lore raw

cover tegra2: move tegra2 SoC code to arch/arm/cpu/tegra2-common

This is part of an upcoming patch set to move all armv4t code out of tegra2 u-boot and put it into an SPL, but I wanted to get some early feedback on this patch. This moves most of the tegra2 SoC code from arch/arm/cpu/armv7 to a new directory arch/arm/cpu/tegra2-common. This code will be shared between the armv7 and armv4t builds of tegra2.

-Allen
nvpublic

#1 lore raw

PATCH 1/1 tegra2: move tegra2 SoC code to arch/arm/cpu/tegra2-common

In preparation for splitting out the armv4t code from tegra2, move the tegra2 SoC code to arch/arm/cpu/tegra2-common. This code will be compiled armv4t for the arm7tdmi and armv7 for the cortex A9.

---
 Makefile                                   |    3 +
 arch/arm/cpu/armv7/tegra2/Makefile         |   12 +-
 arch/arm/cpu/armv7/tegra2/ap20.c           |  324 ---------
 arch/arm/cpu/armv7/tegra2/ap20.h           |  102 ---
 arch/arm/cpu/armv7/tegra2/board.c          |  151 ----
 arch/arm/cpu/armv7/tegra2/clock.c          | 1052 ----------------------------
 arch/arm/cpu/armv7/tegra2/funcmux.c        |  184 -----
 arch/arm/cpu/armv7/tegra2/lowlevel_init.S  |   41 --
 arch/arm/cpu/armv7/tegra2/pinmux.c         |  572 ---------------
 arch/arm/cpu/armv7/tegra2/sys_info.c       |   35 -
 arch/arm/cpu/armv7/tegra2/timer.c          |  111 ---
 arch/arm/cpu/tegra2-common/Makefile        |   56 ++
 arch/arm/cpu/tegra2-common/ap20.c          |  324 +++++++++
 arch/arm/cpu/tegra2-common/ap20.h          |  102 +++
 arch/arm/cpu/tegra2-common/board.c         |  151 ++++
 arch/arm/cpu/tegra2-common/clock.c         | 1052 ++++++++++++++++++++++++++++
 arch/arm/cpu/tegra2-common/funcmux.c       |  184 +++++
 arch/arm/cpu/tegra2-common/lowlevel_init.S |   41 ++
 arch/arm/cpu/tegra2-common/pinmux.c        |  572 +++++++++++++++
 arch/arm/cpu/tegra2-common/sys_info.c      |   35 +
 arch/arm/cpu/tegra2-common/timer.c         |  111 +++
 spl/Makefile                               |    4 +
 22 files changed, 2637 insertions(+), 2582 deletions(-)
 delete mode 100644 arch/arm/cpu/armv7/tegra2/ap20.c
 delete mode 100644 arch/arm/cpu/armv7/tegra2/ap20.h
 delete mode 100644 arch/arm/cpu/armv7/tegra2/board.c
 delete mode 100644 arch/arm/cpu/armv7/tegra2/clock.c
 delete mode 100644 arch/arm/cpu/armv7/tegra2/funcmux.c
 delete mode 100644 arch/arm/cpu/armv7/tegra2/lowlevel_init.S
 delete mode 100644 arch/arm/cpu/armv7/tegra2/pinmux.c
 delete mode 100644 arch/arm/cpu/armv7/tegra2/sys_info.c
 delete mode 100644 arch/arm/cpu/armv7/tegra2/timer.c
 create mode 100644 arch/arm/cpu/tegra2-common/Makefile
 create mode 100644 arch/arm/cpu/tegra2-common/ap20.c
 create mode 100644 arch/arm/cpu/tegra2-common/ap20.h
 create mode 100644 arch/arm/cpu/tegra2-common/board.c
 create mode 100644 arch/arm/cpu/tegra2-common/clock.c
 create mode 100644 arch/arm/cpu/tegra2-common/funcmux.c
 create mode 100644 arch/arm/cpu/tegra2-common/lowlevel_init.S
 create mode 100644 arch/arm/cpu/tegra2-common/pinmux.c
 create mode 100644 arch/arm/cpu/tegra2-common/sys_info.c
 create mode 100644 arch/arm/cpu/tegra2-common/timer.c
Makefile +3 -0
index 4ddf8d6..6639de0 100644
@@ -319,6 +319,9 @@ endif
 ifeq ($(SOC),exynos)
 LIBS += $(CPUDIR)/s5p-common/libs5p-common.o
 endif
+ifeq ($(SOC),tegra2)
+LIBS += $(OBJTREE)/arch/$(ARCH)/cpu/$(SOC)-common/lib$(SOC)-common.o
+endif
 
 LIBS := $(addprefix $(obj),$(sort $(LIBS)))
 .PHONY : $(LIBS)
arch/arm/cpu/armv7/tegra2/Makefile +2 -10
index e9ac6c9..34452c4 100644
@@ -22,23 +22,15 @@
 # Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 # MA 02111-1307 USA
 #
-
-# The AVP is ARMv4T architecture so we must use special compiler
-# flags for any startup files it might use.
-CFLAGS_arch/arm/cpu/armv7/tegra2/ap20.o += -march=armv4t
-CFLAGS_arch/arm/cpu/armv7/tegra2/clock.o += -march=armv4t
-
 include $(TOPDIR)/config.mk
 
 LIB	=  $(obj)lib$(SOC).o
 
-SOBJS	:= lowlevel_init.o
-COBJS-y	:= ap20.o board.o clock.o funcmux.o pinmux.o sys_info.o timer.o
 COBJS-$(CONFIG_USB_EHCI_TEGRA) += usb.o
 
 COBJS	:= $(COBJS-y)
-SRCS	:= $(SOBJS:.o=.S) $(COBJS:.o=.c)
-OBJS	:= $(addprefix $(obj),$(COBJS) $(SOBJS))
+SRCS	:= $(COBJS:.o=.c)
+OBJS	:= $(addprefix $(obj),$(COBJS))
 
 all:	 $(obj).depend $(LIB)
 
arch/arm/cpu/armv7/tegra2/ap20.c deleted +0 -324

324 lines not on this page · raw message

arch/arm/cpu/armv7/tegra2/ap20.h deleted +0 -102

102 lines not on this page · raw message

arch/arm/cpu/armv7/tegra2/board.c deleted +0 -151

151 lines not on this page · raw message

arch/arm/cpu/armv7/tegra2/clock.c deleted +0 -1052

1,052 lines not on this page · raw message

arch/arm/cpu/armv7/tegra2/funcmux.c deleted +0 -184

184 lines not on this page · raw message

arch/arm/cpu/armv7/tegra2/lowlevel_init.S deleted +0 -41

41 lines not on this page · raw message

arch/arm/cpu/armv7/tegra2/pinmux.c deleted +0 -572

572 lines not on this page · raw message

arch/arm/cpu/armv7/tegra2/sys_info.c deleted +0 -35
deleted file mode 100644
index 6d11dc1..0000000
@@ -1,35 +0,0 @@
-/*
- * (C) Copyright 2010,2011
- * NVIDIA Corporation <www.nvidia.com>
- *
- * See file CREDITS for list of people who contributed to this
- * project.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2 of
- * the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
- * MA 02111-1307 USA
- */
-
-#include <common.h>
-
-#ifdef CONFIG_DISPLAY_CPUINFO
-/* Print CPU information */
-int print_cpuinfo(void)
-{
-	puts("TEGRA2\n");
-
-	/* TBD: Add printf of major/minor rev info, stepping, etc. */
-	return 0;
-}
-#endif	/* CONFIG_DISPLAY_CPUINFO */
arch/arm/cpu/armv7/tegra2/timer.c deleted +0 -111

111 lines not on this page · raw message

arch/arm/cpu/tegra2-common/Makefile new file +56 -0

56 lines not on this page · raw message

arch/arm/cpu/tegra2-common/ap20.c new file +324 -0

324 lines not on this page · raw message

arch/arm/cpu/tegra2-common/ap20.h new file +102 -0

14 lines not on this page · raw message

arch/arm/cpu/tegra2-common/board.c new file +151 -0

151 lines not on this page · raw message

arch/arm/cpu/tegra2-common/clock.c new file +1052 -0

1,052 lines not on this page · raw message

arch/arm/cpu/tegra2-common/funcmux.c new file +184 -0

184 lines not on this page · raw message

arch/arm/cpu/tegra2-common/lowlevel_init.S new file +41 -0

41 lines not on this page · raw message

arch/arm/cpu/tegra2-common/pinmux.c new file +572 -0

572 lines not on this page · raw message

arch/arm/cpu/tegra2-common/sys_info.c new file +35 -0
new file mode 100644
index 0000000..6d11dc1

Lines of this file are not shown. View the raw message.

arch/arm/cpu/tegra2-common/timer.c new file +111 -0

111 lines not on this page · raw message

spl/Makefile +4 -0
index ea7d475..6d3241f 100644

Lines of this file are not shown. View the raw message.

The rest of this diff is not shown. View the raw message.

Signature · 1 line
1.7.5.4

Part of the diff is not shown here. View the raw message.

#2 lore raw

PATCH 1/1 tegra2: move tegra2 SoC code to arch/arm/cpu/tegra2-common

In preparation for splitting out the armv4t code from tegra2, move the tegra2 SoC code to arch/arm/cpu/tegra2-common. This code will be compiled armv4t for the arm7tdmi and armv7 for the cortex A9.

---
Resending this with "git format-patch -M" to make it more readable and removing cover letter

This is part of an upcoming patch set to move all armv4t code out of tegra2 u-boot and put it into an SPL, but I wanted to get some early feedback on this patch. This moves most of the tegra2 SoC code from arch/arm/cpu/armv7 to a new directory arch/arm/cpu/tegra2-common. This code will be shared between the armv7 and armv4t builds of tegra2.

 Makefile                                           |    3 +
 arch/arm/cpu/armv7/tegra2/Makefile                 |   12 +----
 arch/arm/cpu/tegra2-common/Makefile                |   56 ++++++++++++++++++++
 .../arm/cpu/{armv7/tegra2 => tegra2-common}/ap20.c |    0
 .../arm/cpu/{armv7/tegra2 => tegra2-common}/ap20.h |    0
 .../cpu/{armv7/tegra2 => tegra2-common}/board.c    |    0
 .../cpu/{armv7/tegra2 => tegra2-common}/clock.c    |    0
 .../cpu/{armv7/tegra2 => tegra2-common}/funcmux.c  |    0
 .../tegra2 => tegra2-common}/lowlevel_init.S       |    0
 .../cpu/{armv7/tegra2 => tegra2-common}/pinmux.c   |    0
 .../cpu/{armv7/tegra2 => tegra2-common}/sys_info.c |    0
 .../cpu/{armv7/tegra2 => tegra2-common}/timer.c    |    0
 spl/Makefile                                       |    4 ++
 13 files changed, 65 insertions(+), 10 deletions(-)
 create mode 100644 arch/arm/cpu/tegra2-common/Makefile
 rename arch/arm/cpu/{armv7/tegra2 => tegra2-common}/ap20.c (100%)
 rename arch/arm/cpu/{armv7/tegra2 => tegra2-common}/ap20.h (100%)
 rename arch/arm/cpu/{armv7/tegra2 => tegra2-common}/board.c (100%)
 rename arch/arm/cpu/{armv7/tegra2 => tegra2-common}/clock.c (100%)
 rename arch/arm/cpu/{armv7/tegra2 => tegra2-common}/funcmux.c (100%)
 rename arch/arm/cpu/{armv7/tegra2 => tegra2-common}/lowlevel_init.S (100%)
 rename arch/arm/cpu/{armv7/tegra2 => tegra2-common}/pinmux.c (100%)
 rename arch/arm/cpu/{armv7/tegra2 => tegra2-common}/sys_info.c (100%)
 rename arch/arm/cpu/{armv7/tegra2 => tegra2-common}/timer.c (100%)
Makefile +3 -0
index 4ddf8d6..6639de0 100644
@@ -319,6 +319,9 @@ endif
 ifeq ($(SOC),exynos)
 LIBS += $(CPUDIR)/s5p-common/libs5p-common.o
 endif
+ifeq ($(SOC),tegra2)
+LIBS += $(OBJTREE)/arch/$(ARCH)/cpu/$(SOC)-common/lib$(SOC)-common.o
+endif
 
 LIBS := $(addprefix $(obj),$(sort $(LIBS)))
 .PHONY : $(LIBS)
arch/arm/cpu/armv7/tegra2/Makefile +2 -10
index e9ac6c9..34452c4 100644
@@ -22,23 +22,15 @@
 # Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 # MA 02111-1307 USA
 #
-
-# The AVP is ARMv4T architecture so we must use special compiler
-# flags for any startup files it might use.
-CFLAGS_arch/arm/cpu/armv7/tegra2/ap20.o += -march=armv4t
-CFLAGS_arch/arm/cpu/armv7/tegra2/clock.o += -march=armv4t
-
 include $(TOPDIR)/config.mk
 
 LIB	=  $(obj)lib$(SOC).o
 
-SOBJS	:= lowlevel_init.o
-COBJS-y	:= ap20.o board.o clock.o funcmux.o pinmux.o sys_info.o timer.o
 COBJS-$(CONFIG_USB_EHCI_TEGRA) += usb.o
 
 COBJS	:= $(COBJS-y)
-SRCS	:= $(SOBJS:.o=.S) $(COBJS:.o=.c)
-OBJS	:= $(addprefix $(obj),$(COBJS) $(SOBJS))
+SRCS	:= $(COBJS:.o=.c)
+OBJS	:= $(addprefix $(obj),$(COBJS))
 
 all:	 $(obj).depend $(LIB)
 
arch/arm/cpu/tegra2-common/Makefile new file +56 -0

56 lines not on this page · raw message

arch/arm/cpu/tegra2-common/ap20.c renamed from arch/arm/cpu/armv7/tegra2/ap20.c +0 -0
similarity index 100%
rename from arch/arm/cpu/armv7/tegra2/ap20.c
rename to arch/arm/cpu/tegra2-common/ap20.c
arch/arm/cpu/tegra2-common/ap20.h renamed from arch/arm/cpu/armv7/tegra2/ap20.h +0 -0
similarity index 100%
rename from arch/arm/cpu/armv7/tegra2/ap20.h
rename to arch/arm/cpu/tegra2-common/ap20.h
arch/arm/cpu/tegra2-common/board.c renamed from arch/arm/cpu/armv7/tegra2/board.c +0 -0
similarity index 100%
rename from arch/arm/cpu/armv7/tegra2/board.c
rename to arch/arm/cpu/tegra2-common/board.c
arch/arm/cpu/tegra2-common/clock.c renamed from arch/arm/cpu/armv7/tegra2/clock.c +0 -0
similarity index 100%
rename from arch/arm/cpu/armv7/tegra2/clock.c
rename to arch/arm/cpu/tegra2-common/clock.c
arch/arm/cpu/tegra2-common/funcmux.c renamed from arch/arm/cpu/armv7/tegra2/funcmux.c +0 -0
similarity index 100%
rename from arch/arm/cpu/armv7/tegra2/funcmux.c
rename to arch/arm/cpu/tegra2-common/funcmux.c
arch/arm/cpu/tegra2-common/lowlevel_init.S renamed from arch/arm/cpu/armv7/tegra2/lowlevel_init.S +0 -0
similarity index 100%
rename from arch/arm/cpu/armv7/tegra2/lowlevel_init.S
rename to arch/arm/cpu/tegra2-common/lowlevel_init.S
arch/arm/cpu/tegra2-common/pinmux.c renamed from arch/arm/cpu/armv7/tegra2/pinmux.c +0 -0
similarity index 100%
rename from arch/arm/cpu/armv7/tegra2/pinmux.c
rename to arch/arm/cpu/tegra2-common/pinmux.c
arch/arm/cpu/tegra2-common/sys_info.c renamed from arch/arm/cpu/armv7/tegra2/sys_info.c +0 -0
similarity index 100%
rename from arch/arm/cpu/armv7/tegra2/sys_info.c
rename to arch/arm/cpu/tegra2-common/sys_info.c
arch/arm/cpu/tegra2-common/timer.c renamed from arch/arm/cpu/armv7/tegra2/timer.c +0 -0
similarity index 100%
rename from arch/arm/cpu/armv7/tegra2/timer.c
rename to arch/arm/cpu/tegra2-common/timer.c
spl/Makefile +4 -0
index ea7d475..6d3241f 100644
@@ -62,6 +62,10 @@ ifneq ($(CONFIG_AM33XX)$(CONFIG_OMAP34XX)$(CONFIG_OMAP44XX)$(CONFIG_OMAP54XX),)
 LIBS-y += $(CPUDIR)/omap-common/libomap-common.o
 endif
 
+ifneq ($(CONFIG_TEGRA2),)
+LIBS-y += arch/$(ARCH)/cpu/$(SOC)-common/lib$(SOC)-common.o
+endif
+
 START := $(addprefix $(SPLTREE)/,$(START))
 LIBS := $(addprefix $(SPLTREE)/,$(sort $(LIBS-y)))
 
Signature · 1 line
1.7.5.4
#3 lore raw

PATCH 1/1 tegra2: move tegra2 SoC code to arch/arm/cpu/tegra2-common

+Albert

Hi Allen,

Quoted 9 lines · Allen Martin

In preparation for splitting out the armv4t code from tegra2, move the tegra2 SoC code to arch/arm/cpu/tegra2-common. ?This code will be compiled armv4t for the arm7tdmi and armv7 for the cortex A9.

---
Resending this with "git format-patch -M" to make it more readable and removing cover letter

Quoted 6 lines

This is part of an upcoming patch set to move all armv4t code out of tegra2 u-boot and put it into an SPL, but I wanted to get some early feedback on this patch. ?This moves most of the tegra2 SoC code from arch/arm/cpu/armv7 to a new directory arch/arm/cpu/tegra2-common. This code will be shared between the armv7 and armv4t builds of tegra2.

I am not sure whether moving things up a level is OK. It makes some sense to me but is different from what other boards do.

Secondly, you will at some point add Tegra 3 support I suppose. In that case much of this code will become common anyway. Should you do that split (tegra-common, tegra2-common) now or later?

Regards,
Simon

#4 lore raw

PATCH 1/1 tegra2: move tegra2 SoC code to arch/arm/cpu/tegra2-common

Quoted 10 lines · Simon Glass
Quoted 7 lines

This is part of an upcoming patch set to move all armv4t code out of tegra2 u-boot and put it into an SPL, but I wanted to get some early feedback on this patch. ?This moves most of the tegra2 SoC code from arch/arm/cpu/armv7 to a new directory arch/arm/cpu/tegra2-common. This code will be shared between the armv7 and armv4t builds of tegra2.

I am not sure whether moving things up a level is OK. It makes some sense to me but is different from what other boards do.

Agreed I couldn't find any other examples, but AFAIK no other board is trying to do what we do (sharing code between 2 different CPU models). The other options I contemplated were:

-Have the armv4t build reach up and over into armv7 -Move the code out to board/nvidia

Both of these seemed worse

Quoted 3 lines

Secondly, you will at some point add Tegra 3 support I suppose. In that case much of this code will become common anyway. Should you do that split (tegra-common, tegra2-common) now or later?

I'd like to keep the tegra3 changes separate since that will involve refactoring of much of this code. For the SPL build it's mostly hidden in the config and Makefiles.

I thought about doing exactly what you said to reduce the amount of code I needed to pull into the SPL build, but what I found was that because the SPL needs to initialize some regulators, clocks, and pinmux to bring up the A9 and UART it ends up needing much of the tegra2 SoC code, so there's not a lot of opportunity to minize the code set for the SPL build beyond the CONFIG options to disable drivers that area already there.

-Allen
nvpublic

#5 lore raw

PATCH 1/1 tegra2: move tegra2 SoC code to arch/arm/cpu/tegra2-common

Hi Allen,

Quoted 19 lines · Allen Martin
Quoted 10 lines · Simon Glass
Quoted 7 lines

This is part of an upcoming patch set to move all armv4t code out of tegra2 u-boot and put it into an SPL, but I wanted to get some early feedback on this patch. This moves most of the tegra2 SoC code from arch/arm/cpu/armv7 to a new directory arch/arm/cpu/tegra2-common. This code will be shared between the armv7 and armv4t builds of tegra2.

I am not sure whether moving things up a level is OK. It makes some sense to me but is different from what other boards do.

Agreed I couldn't find any other examples, but AFAIK no other board is trying to do what we do (sharing code between 2 different CPU models). The other options I contemplated were:

(quoted diff) +0 -2
-Have the armv4t build reach up and over into armv7
-Move the code out to board/nvidia
Quoted 2 lines

Both of these seemed worse

I've thought about this a bit more. To me you have a bit of a unique problem in that you need to build the code as both ARMv4T and ARMv7. The way it works at the moment is pretty simple - we just mark a few files that must be build with ARMv4T and ARMv7 is happy with that also.

I believe the point of the 'cpu' directory is to separate out common code between different architectures. It seems you want a chip which uses two different architectures. That might be unique in the U-Boot world - I note that other SOCs with different chips use ARMv7 for all of them.

But really, who cares what architecture you actually use? The code clearly doesn't include ARMv7-isms otherwise it wouldn't build with current compile options. It does work...

So my suggestion is that you just continue as now, and build the relevant code for ARMv4T. I don't see a compelling reason to move it, least of all into a no-man's land at the same level as 'cpu'.

Quoted 9 lines
Quoted 4 lines

Secondly, you will at some point add Tegra 3 support I suppose. In that case much of this code will become common anyway. Should you do that split (tegra-common, tegra2-common) now or later?

I'd like to keep the tegra3 changes separate since that will involve refactoring of much of this code. For the SPL build it's mostly hidden in the config and Makefiles.

Quoted 8 lines

I thought about doing exactly what you said to reduce the amount of code I needed to pull into the SPL build, but what I found was that because the SPL needs to initialize some regulators, clocks, and pinmux to bring up the A9 and UART it ends up needing much of the tegra2 SoC code, so there's not a lot of opportunity to minize the code set for the SPL build beyond the CONFIG options to disable drivers that area already there.

OK. Please note that we do have a refactor in the Chromium tree to move things into tegra-common and add T30 support. We hope to get this upstream once the T20 stuff is there (NAND, keyboard and LCD are still pending).

Regards,
Simon

Quoted 4 lines

-Allen
nvpublic

#6 lore raw

PATCH 1/1 tegra2: move tegra2 SoC code to arch/arm/cpu/tegra2-common

Quoted 6 lines · Simon Glass
(quoted diff) +0 -2
-Have the armv4t build reach up and over into armv7
-Move the code out to board/nvidia

Both of these seemed worse

Quoted 8 lines

I've thought about this a bit more. To me you have a bit of a unique problem in that you need to build the code as both ARMv4T and ARMv7. The way it works at the moment is pretty simple - we just mark a few files that must be build with ARMv4T and ARMv7 is happy with that also.

I believe the point of the 'cpu' directory is to separate out common code between different architectures. It seems you want a chip which uses two different architectures. That might be unique in the U-Boot world - I note that other SOCs with different chips use ARMv7 for all of them.

But really, who cares what architecture you actually use? The code clearly doesn't include ARMv7-isms otherwise it wouldn't build with current compile options. It does work...

So my suggestion is that you just continue as now, and build the relevant code for ARMv4T. I don't see a compelling reason to move it, least of all into a no-man's land at the same level as 'cpu'.

The problem that pushed me over the edge on this was the patch series to add thumb support for ARM. The linker has to insert interworking code for the cross ARM/thumb calls. If it is linking armv4t and armv7 objects together it will promote them all to armv7 style interworking which uses instructions that are illegal on armv4t. The only fix for this is to link armv4t objects separately or not support thumb, and we would really like to support thumb.

Also it's not true that the code in arch/arm/cpu/armv7 doesn't include any armv7'isms, we're just #ifdef around them for the tegra and call them later in the boot sequence when we know we're running on the A9. We also have to code the init sequence extremely carefully to make sure we don't call any armv7 code on the armv4t. It's extremely fragile as any changes to start.S or the ordering of the init sequence can (and have) broken us.

-Allen
--
nvpublic

#7 lore raw

PATCH 1/1 tegra2: move tegra2 SoC code to arch/arm/cpu/tegra2-common

Hi Allen,

Quoted 26 lines · Allen Martin
Quoted 7 lines · Simon Glass
(quoted diff) +0 -2
-Have the armv4t build reach up and over into armv7
-Move the code out to board/nvidia

Both of these seemed worse

I've thought about this a bit more. To me you have a bit of a unique

problem in that you need to build the code as both ARMv4T and ARMv7. The way it works at the moment is pretty simple - we just mark a few files that must be build with ARMv4T and ARMv7 is happy with that also.

Quoted 2 lines

I believe the point of the 'cpu' directory is to separate out common

code between different architectures. It seems you want a chip which uses two different architectures. That might be unique in the U-Boot world - I note that other SOCs with different chips use ARMv7 for all of them.

Quoted 2 lines

But really, who cares what architecture you actually use? The code

clearly doesn't include ARMv7-isms otherwise it wouldn't build with current compile options. It does work...

Quoted 2 lines

So my suggestion is that you just continue as now, and build the

relevant code for ARMv4T. I don't see a compelling reason to move it, least of all into a no-man's land at the same level as 'cpu'.

Quoted 1 line
Quoted 8 lines

The problem that pushed me over the edge on this was the patch series to add thumb support for ARM. The linker has to insert interworking code for the cross ARM/thumb calls. If it is linking armv4t and armv7 objects together it will promote them all to armv7 style interworking which uses instructions that are illegal on armv4t. The only fix for this is to link armv4t objects separately or not support thumb, and we would really like to support thumb.

OK I just remembered this thread...

The Thumb reason makes good sense to me. That said, you could arrange to avoid interworked calls and have all the ARMv4 code built with the same flags (and not allow the ARM7TDMI to enter board_init_f()).

So perhaps another way of putting it is that you are using SPL as a convenient and existing way to allow you to built two parts of U-Boot with separate flags.

Quoted 9 lines

Also it's not true that the code in arch/arm/cpu/armv7 doesn't include any armv7'isms, we're just #ifdef around them for the tegra and call them later in the boot sequence when we know we're running on the A9. We also have to code the init sequence extremely carefully to make sure we don't call any armv7 code on the armv4t. It's extremely fragile as any changes to start.S or the ordering of the init sequence can (and have) broken us.

See my other mail about this. I think you overstate things a little :-)
But anyway, I think I understand the desirability for this now.

Quoted 5 lines

-Allen
--
nvpublic

Regards,
Simon