Skip to contentSkip to conversation

ARM: zynq: ARCH_MULTIPLATFORM support

PATCH Applied Josh Cartwright 4 participants 9 messages Nov 19, 2012 – Nov 21, 2012

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

cover ARM: zynq: ARCH_MULTIPLATFORM support

Michal-

Here's an attempt at supporting ARCH_MULTIPLATFORM on Zynq. I've gotten a multiplatform kernel building and booting on the zc702, although I haven't tried to boot the same image on another non-Zynq board, due to lack of available hardware.

It would be super awesome if this set could land in 3.8, but I know we're running out of time there. I wouldn't be too heartbroken if it didn't make it.

This patchset is on top of your arm-next branch and with the debug_ll_init support patch @ arm-soc/devel/debug_ll_init.

Patch 1 drops the early TTC mapping. It is not necessary, since the TTC driver now supports pulling mapping info from the device tree.

Patch 2 converts zynq to use the debug_ll_init() infrastructure slated to go into 3.8.

Patch 3 is the bulk of the set, moving around logic around within mach-zynq/include, and setting up the necessary build magic to get Zynq building w/ CONFIG_ARCH_MULTIPLATFORM.

Thanks,
Josh

---
Josh Cartwright (3):
ARM: zynq: remove TTC early mapping
ARM: zynq: make use of debug_ll_io_init()
ARM: zynq: add support for ARCH_MULTIPLATFORM

 arch/arm/Kconfig                                   | 14 +-----
 arch/arm/Kconfig.debug                             |  1 +
 .../mach/debug-macro.S => include/debug/zynq.S}    | 23 ++++++++--
 arch/arm/mach-zynq/Kconfig                         | 13 ++++++
 arch/arm/mach-zynq/common.c                        | 38 +++++-----------
 arch/arm/mach-zynq/include/mach/uart.h             | 25 ----------
 arch/arm/mach-zynq/include/mach/uncompress.h       | 51 ---------------------
 arch/arm/mach-zynq/include/mach/zynq_soc.h         | 53 ----------------------
 arch/arm/mach-zynq/timer.c                         |  1 -
 9 files changed, 46 insertions(+), 173 deletions(-)
 rename arch/arm/{mach-zynq/include/mach/debug-macro.S => include/debug/zynq.S} (61%)
 create mode 100644 arch/arm/mach-zynq/Kconfig
 delete mode 100644 arch/arm/mach-zynq/include/mach/uart.h
 delete mode 100644 arch/arm/mach-zynq/include/mach/uncompress.h
 delete mode 100644 arch/arm/mach-zynq/include/mach/zynq_soc.h
Signature · 1 line
1.8.0
#1 lore raw

PATCH 1/3 ARM: zynq: remove TTC early mapping

Now that the TTC driver has proper support for DT bindings, it is not necessary for the registers to be mapped early. They will be mapped during clock initialization using of_iomap(). Remove the early mapping.

In addition, remove the extraneous zynq_soc.h include from the timer driver.

---
 arch/arm/mach-zynq/common.c                | 5 -----
 arch/arm/mach-zynq/include/mach/zynq_soc.h | 6 +-----
 arch/arm/mach-zynq/timer.c                 | 1 -
 3 files changed, 1 insertion(+), 11 deletions(-)
arch/arm/mach-zynq/common.c +0 -5
index 79bf5fb..2202f67 100644
@@ -74,11 +74,6 @@ static void __init xilinx_irq_init(void)
 
 static struct map_desc io_desc[] __initdata = {
 	{
-		.virtual	= TTC0_VIRT,
-		.pfn		= __phys_to_pfn(TTC0_PHYS),
-		.length		= TTC0_SIZE,
-		.type		= MT_DEVICE,
-	}, {
 		.virtual	= SCU_PERIPH_VIRT,
 		.pfn		= __phys_to_pfn(SCU_PERIPH_PHYS),
 		.length		= SCU_PERIPH_SIZE,
arch/arm/mach-zynq/include/mach/zynq_soc.h +1 -5
index 5ebbd8e..2995044 100644
@@ -29,13 +29,9 @@
 #define UART_SIZE		SZ_4K
 #define UART_VIRT		0xF0001000
 
-#define TTC0_PHYS		0xF8001000
-#define TTC0_SIZE		SZ_4K
-#define TTC0_VIRT		(VMALLOC_END - TTC0_SIZE)
-
 #define SCU_PERIPH_PHYS		0xF8F00000
 #define SCU_PERIPH_SIZE		SZ_8K
-#define SCU_PERIPH_VIRT		(TTC0_VIRT - SCU_PERIPH_SIZE)
+#define SCU_PERIPH_VIRT		(VMALLOC_END - SCU_PERIPH_SIZE)
 
 #if IS_ENABLED(CONFIG_DEBUG_ZYNQ_UART1)
 # define LL_UART_PADDR		UART1_PHYS
arch/arm/mach-zynq/timer.c +0 -1
index 9662306..de3df28 100644
@@ -29,7 +29,6 @@
 #include <linux/slab.h>
 #include <linux/clk-provider.h>
 
-#include <mach/zynq_soc.h>
 #include "common.h"
 
 /*
Signature · 1 line
1.8.0
Tested-by on v1 1/3 Applied
#2 lore raw

Re: [PATCH 1/3] ARM: zynq: remove TTC early mapping

2012/11/19 Josh Cartwright <[email protected]>:

Quoted 7 lines

Now that the TTC driver has proper support for DT bindings, it is not necessary for the registers to be mapped early. They will be mapped during clock initialization using of_iomap(). Remove the early mapping.

In addition, remove the extraneous zynq_soc.h include from the timer driver.

Quoted 6 lines
---
 arch/arm/mach-zynq/common.c                | 5 -----
 arch/arm/mach-zynq/include/mach/zynq_soc.h | 6 +-----
 arch/arm/mach-zynq/timer.c                 | 1 -
 3 files changed, 1 insertion(+), 11 deletions(-)

Applied to xilinx arm-next branch.

Thanks,
Michal

Signature · 4 lines
Michal Simek, Ing. (M.Eng)
w: www.monstr.eu p: +42-0-721842854
Maintainer of Linux kernel 2.6 Microblaze Linux - http://www.monstr.eu/fdt/
Microblaze U-BOOT custodian
#3 lore raw

PATCH 2/3 ARM: zynq: make use of debug_ll_io_init()

In reply to Josh Cartwright

Convert low-level debugging routines to make use of debug_ll_io_init(). This is part of the preparation for ARCH_MULTIPLATFORM support for Zynq.

---
 arch/arm/Kconfig.debug                             |  1 +
 .../mach/debug-macro.S => include/debug/zynq.S}    |  3 +--
 arch/arm/mach-zynq/common.c                        | 25 ++++++----------------
 3 files changed, 9 insertions(+), 20 deletions(-)
 rename arch/arm/{mach-zynq/include/mach/debug-macro.S => include/debug/zynq.S} (94%)
arch/arm/Kconfig.debug +1 -0
index 7754d51..d6bdad2 100644
@@ -435,6 +435,7 @@ config DEBUG_LL_INCLUDE
 	default "debug/socfpga.S" if DEBUG_SOCFPGA_UART
 	default "debug/vexpress.S" if DEBUG_VEXPRESS_UART0_DETECT || \
 		DEBUG_VEXPRESS_UART0_CA9 || DEBUG_VEXPRESS_UART0_RS1
+	default "debug/zynq.S" if DEBUG_ZYNQ_UART0 || DEBUG_ZYNQ_UART1
 	default "mach/debug-macro.S"
 
 config EARLY_PRINTK
arch/arm/include/debug/zynq.S renamed from arch/arm/mach-zynq/include/mach/debug-macro.S +1 -2
similarity index 94%
rename from arch/arm/mach-zynq/include/mach/debug-macro.S
rename to arch/arm/include/debug/zynq.S
index 3ab0be1..08aed97 100644
@@ -1,5 +1,4 @@
-/* arch/arm/mach-zynq/include/mach/debug-macro.S
- *
+/*
  * Debugging macro include header
  *
  *  Copyright (C) 2011 Xilinx
arch/arm/mach-zynq/common.c +7 -18
index 2202f67..a2f48da 100644
@@ -72,23 +72,11 @@ static void __init xilinx_irq_init(void)
  * running include the GIC, UART and Timer Counter.
  */
 
-static struct map_desc io_desc[] __initdata = {
-	{
-		.virtual	= SCU_PERIPH_VIRT,
-		.pfn		= __phys_to_pfn(SCU_PERIPH_PHYS),
-		.length		= SCU_PERIPH_SIZE,
-		.type		= MT_DEVICE,
-	},
-
-#ifdef CONFIG_DEBUG_LL
-	{
-		.virtual	= LL_UART_VADDR,
-		.pfn		= __phys_to_pfn(LL_UART_PADDR),
-		.length		= UART_SIZE,
-		.type		= MT_DEVICE,
-	},
-#endif
-
+static struct map_desc scu_desc __initdata = {
+	.virtual	= SCU_PERIPH_VIRT,
+	.pfn		= __phys_to_pfn(SCU_PERIPH_PHYS),
+	.length		= SCU_PERIPH_SIZE,
+	.type		= MT_DEVICE,
 };
 
 static void __init xilinx_zynq_timer_init(void)
@@ -117,7 +105,8 @@ static struct sys_timer xttcpss_sys_timer = {
  */
 static void __init xilinx_map_io(void)
 {
-	iotable_init(io_desc, ARRAY_SIZE(io_desc));
+	debug_ll_io_init();
+	iotable_init(&scu_desc, 1);
 }
 
 static const char *xilinx_dt_match[] = {
Signature · 1 line
1.8.0
Tested-by on v1 2/3 Applied
#4 lore raw

Re: [PATCH 2/3] ARM: zynq: make use of debug_ll_io_init()

2012/11/19 Josh Cartwright <[email protected]>:

Quoted 10 lines

Convert low-level debugging routines to make use of debug_ll_io_init(). This is part of the preparation for ARCH_MULTIPLATFORM support for Zynq.

---
 arch/arm/Kconfig.debug                             |  1 +
 .../mach/debug-macro.S => include/debug/zynq.S}    |  3 +--
 arch/arm/mach-zynq/common.c                        | 25 ++++++----------------
 3 files changed, 9 insertions(+), 20 deletions(-)
 rename arch/arm/{mach-zynq/include/mach/debug-macro.S => include/debug/zynq.S} (94%)

Applied to xilinx arm-next branch.

Thanks,
Michal

#5 lore raw

PATCH 3/3 ARM: zynq: add support for ARCH_MULTIPLATFORM

In reply to Josh Cartwright

The majority of changes are necessary to remove dependencies on header files within arch/arm/mach-zynq/include/mach:

uncompress.h
- Deleted. It is unused for ARCH_MULTIPLATFORM builds.

uart.h:
- Move uart definitions out of uart.h into debug/zynq.S, which is now the only user

zynq_soc.h:
- Move SCU address definitions into common.c.
- Other #defines, such as PERIPHERAL_CLOCK_RATE, TTC0_BASE, etc, are unused and can be dropped

---
 arch/arm/Kconfig                             | 14 ++------
 arch/arm/include/debug/zynq.S                | 20 +++++++++--
 arch/arm/mach-zynq/Kconfig                   | 13 +++++++
 arch/arm/mach-zynq/common.c                  |  8 ++---
 arch/arm/mach-zynq/include/mach/uart.h       | 25 --------------
 arch/arm/mach-zynq/include/mach/uncompress.h | 51 ----------------------------
 arch/arm/mach-zynq/include/mach/zynq_soc.h   | 49 --------------------------
 7 files changed, 37 insertions(+), 143 deletions(-)
 create mode 100644 arch/arm/mach-zynq/Kconfig
 delete mode 100644 arch/arm/mach-zynq/include/mach/uart.h
 delete mode 100644 arch/arm/mach-zynq/include/mach/uncompress.h
 delete mode 100644 arch/arm/mach-zynq/include/mach/zynq_soc.h
arch/arm/Kconfig +2 -12
index ccfe0ab..28a2048 100644
@@ -955,18 +955,6 @@ config ARCH_VT8500
 	help
 	  Support for VIA/WonderMedia VT8500/WM85xx System-on-Chip.
 
-config ARCH_ZYNQ
-	bool "Xilinx Zynq ARM Cortex A9 Platform"
-	select ARM_AMBA
-	select ARM_GIC
-	select COMMON_CLK
-	select CPU_V7
-	select GENERIC_CLOCKEVENTS
-	select ICST
-	select MIGHT_HAVE_CACHE_L2X0
-	select USE_OF
-	help
-	  Support for Xilinx Zynq ARM Cortex A9 Platform
 endchoice
 
 menu "Multiple platform selection"
@@ -1128,6 +1116,8 @@ source "arch/arm/plat-versatile/Kconfig"
 
 source "arch/arm/mach-w90x900/Kconfig"
 
+source "arch/arm/mach-zynq/Kconfig"
+
 # Definitions to make life easier
 config ARCH_ACORN
 	bool
arch/arm/include/debug/zynq.S +18 -2
index 08aed97..f9aa974 100644
@@ -12,9 +12,25 @@
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
  */
+#define UART_CR_OFFSET		0x00  /* Control Register [8:0] */
+#define UART_SR_OFFSET		0x2C  /* Channel Status [11:0] */
+#define UART_FIFO_OFFSET	0x30  /* FIFO [15:0] or [7:0] */
 
-#include <mach/zynq_soc.h>
-#include <mach/uart.h>
+#define UART_SR_TXFULL		0x00000010	/* TX FIFO full */
+#define UART_SR_TXEMPTY		0x00000008	/* TX FIFO empty */
+
+#define UART0_PHYS		0xE0000000
+#define UART1_PHYS		0xE0001000
+#define UART_SIZE		SZ_4K
+#define UART_VIRT		0xF0001000
+
+#if IS_ENABLED(CONFIG_DEBUG_ZYNQ_UART1)
+# define LL_UART_PADDR		UART1_PHYS
+#else
+# define LL_UART_PADDR		UART0_PHYS
+#endif
+
+#define LL_UART_VADDR		UART_VIRT
 
 		.macro	addruart, rp, rv, tmp
 		ldr	\rp, =LL_UART_PADDR	@ physical
arch/arm/mach-zynq/Kconfig new file +13 -0
new file mode 100644
index 0000000..adb6c0e
@@ -0,0 +1,13 @@
+config ARCH_ZYNQ
+	bool "Xilinx Zynq ARM Cortex A9 Platform" if ARCH_MULTI_V7
+	select ARM_AMBA
+	select ARM_GIC
+	select COMMON_CLK
+	select CPU_V7
+	select GENERIC_CLOCKEVENTS
+	select ICST
+	select MIGHT_HAVE_CACHE_L2X0
+	select USE_OF
+	select SPARSE_IRQ
+	help
+	  Support for Xilinx Zynq ARM Cortex A9 Platform
arch/arm/mach-zynq/common.c +4 -4
index a2f48da..e16d4be 100644
@@ -30,10 +30,10 @@
 #include <asm/mach/time.h>
 #include <asm/mach-types.h>
 #include <asm/page.h>
+#include <asm/pgtable.h>
 #include <asm/hardware/gic.h>
 #include <asm/hardware/cache-l2x0.h>
 
-#include <mach/zynq_soc.h>
 #include "common.h"
 
 static struct of_device_id zynq_of_bus_ids[] __initdata = {
@@ -68,9 +68,9 @@ static void __init xilinx_irq_init(void)
 	of_irq_init(irq_match);
 }
 
-/* The minimum devices needed to be mapped before the VM system is up and
- * running include the GIC, UART and Timer Counter.
- */
+#define SCU_PERIPH_PHYS		0xF8F00000
+#define SCU_PERIPH_SIZE		SZ_8K
+#define SCU_PERIPH_VIRT		(VMALLOC_END - SCU_PERIPH_SIZE)
 
 static struct map_desc scu_desc __initdata = {
 	.virtual	= SCU_PERIPH_VIRT,
arch/arm/mach-zynq/include/mach/uart.h deleted +0 -25
deleted file mode 100644
index 5c47c97..0000000
@@ -1,25 +0,0 @@
-/* arch/arm/mach-zynq/include/mach/uart.h
- *
- *  Copyright (C) 2011 Xilinx
- *
- * This software is licensed under the terms of the GNU General Public
- * License version 2, as published by the Free Software Foundation, and
- * may be copied, distributed, and modified under those terms.
- *
- * 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.
- */
-
-#ifndef __MACH_UART_H__
-#define __MACH_UART_H__
-
-#define UART_CR_OFFSET		0x00  /* Control Register [8:0] */
-#define UART_SR_OFFSET		0x2C  /* Channel Status [11:0] */
-#define UART_FIFO_OFFSET	0x30  /* FIFO [15:0] or [7:0] */
-
-#define UART_SR_TXFULL		0x00000010	/* TX FIFO full */
-#define UART_SR_TXEMPTY		0x00000008	/* TX FIFO empty */
-
-#endif
arch/arm/mach-zynq/include/mach/uncompress.h deleted +0 -51

51 lines not on this page · raw message

arch/arm/mach-zynq/include/mach/zynq_soc.h deleted +0 -49

49 lines not on this page · raw message

Signature · 1 line
1.8.0
Tested-by on v1 3/3 Applied
#6 lore raw

Re: [PATCH 3/3] ARM: zynq: add support for ARCH_MULTIPLATFORM

2012/11/19 Josh Cartwright <[email protected]>:

Quoted 16 lines

The majority of changes are necessary to remove dependencies on header files within arch/arm/mach-zynq/include/mach:

uncompress.h
- Deleted. It is unused for ARCH_MULTIPLATFORM builds.

uart.h:
- Move uart definitions out of uart.h into debug/zynq.S, which is now the only user

zynq_soc.h:
- Move SCU address definitions into common.c.
- Other #defines, such as PERIPHERAL_CLOCK_RATE, TTC0_BASE, etc, are unused and can be dropped

Quoted 13 lines
---
 arch/arm/Kconfig                             | 14 ++------
 arch/arm/include/debug/zynq.S                | 20 +++++++++--
 arch/arm/mach-zynq/Kconfig                   | 13 +++++++
 arch/arm/mach-zynq/common.c                  |  8 ++---
 arch/arm/mach-zynq/include/mach/uart.h       | 25 --------------
 arch/arm/mach-zynq/include/mach/uncompress.h | 51 ----------------------------
 arch/arm/mach-zynq/include/mach/zynq_soc.h   | 49 --------------------------
 7 files changed, 37 insertions(+), 143 deletions(-)
 create mode 100644 arch/arm/mach-zynq/Kconfig
 delete mode 100644 arch/arm/mach-zynq/include/mach/uart.h
 delete mode 100644 arch/arm/mach-zynq/include/mach/uncompress.h
 delete mode 100644 arch/arm/mach-zynq/include/mach/zynq_soc.h

Applied to xilinx arm-next branch.

Thanks,
Michal

#7 lore raw
In reply to Josh Cartwright

Hi Josh, Arnd and Olof,

2012/11/19 Josh Cartwright <[email protected]>:

Quoted 17 lines

Michal-

Here's an attempt at supporting ARCH_MULTIPLATFORM on Zynq. I've gotten a multiplatform kernel building and booting on the zc702, although I haven't tried to boot the same image on another non-Zynq board, due to lack of available hardware.

It would be super awesome if this set could land in 3.8, but I know we're running out of time there. I wouldn't be too heartbroken if it didn't make it.

This patchset is on top of your arm-next branch and with the debug_ll_init support patch @ arm-soc/devel/debug_ll_init.

Patch 1 drops the early TTC mapping. It is not necessary, since the TTC driver now supports pulling mapping info from the device tree.

Quoted 7 lines

Patch 2 converts zynq to use the debug_ll_init() infrastructure slated to go into 3.8.

Patch 3 is the bulk of the set, moving around logic around within mach-zynq/include, and setting up the necessary build magic to get Zynq building w/ CONFIG_ARCH_MULTIPLATFORM.

I wanted to look at it too today. You were faster! I have tested your patches and all works for me. I have also added them to my arm-next branch.

I don't have others ARM boards to test but it shouldn't be big problem because others will test it.

We are out of merge window that's why we should wait to the next one. Anyway Arnd/Olof if there is any option to get this to v3.8, please let me know.

Thanks,
Michal

Signature · 4 lines
Michal Simek, Ing. (M.Eng)
w: www.monstr.eu p: +42-0-721842854
Maintainer of Linux kernel 2.6 Microblaze Linux - http://www.monstr.eu/fdt/
Microblaze U-BOOT custodian
#8 lore raw
Quoted 32 lines · Michal Simek

Hi Josh, Arnd and Olof,

2012/11/19 Josh Cartwright <[email protected]>:

Quoted 17 lines

Michal-

Here's an attempt at supporting ARCH_MULTIPLATFORM on Zynq. I've gotten a multiplatform kernel building and booting on the zc702, although I haven't tried to boot the same image on another non-Zynq board, due to lack of available hardware.

It would be super awesome if this set could land in 3.8, but I know we're running out of time there. I wouldn't be too heartbroken if it didn't make it.

This patchset is on top of your arm-next branch and with the debug_ll_init support patch @ arm-soc/devel/debug_ll_init.

Patch 1 drops the early TTC mapping. It is not necessary, since the TTC driver now supports pulling mapping info from the device tree.

Quoted 7 lines

Patch 2 converts zynq to use the debug_ll_init() infrastructure slated to go into 3.8.

Patch 3 is the bulk of the set, moving around logic around within mach-zynq/include, and setting up the necessary build magic to get Zynq building w/ CONFIG_ARCH_MULTIPLATFORM.

I wanted to look at it too today. You were faster! I have tested your patches and all works for me. I have also added them to my arm-next branch.

Quoted 5 lines

I don't have others ARM boards to test but it shouldn't be big problem because others will test it.

We are out of merge window that's why we should wait to the next one. Anyway Arnd/Olof if there is any option to get this to v3.8, please let me know.

Feel free to post a pull request, if things look clean we can probably pick it up.

-Olof (playing good cop for once :-)