[fedora-arm] [PATCH] arm: fixes for Calxeda ECX-1000 from testing

Mark Langsdorf mark.langsdorf at calxeda.com
Fri Jun 1 13:21:54 UTC 2012


Calxeda's ECX-1000 chips are available. Various bugs and issues have been
discovered in lab tests. This patch fixes most of the known issues and
creates a highbank kernel that boots on the ECX-1000 chip.

Signed-off-by: Mark Langsdorf <mark.langsdorf at calxeda.com>
---
 config-arm-highbank    |   19 +++++-
 highbank-various.patch |  168 ++++++++++++++++++++++++++++++++++++++++++++++++
 kernel.spec            |    2 +
 3 files changed, 188 insertions(+), 1 deletion(-)
 create mode 100644 highbank-various.patch

diff --git a/config-arm-highbank b/config-arm-highbank
index 60178dd..d86f89e 100644
--- a/config-arm-highbank
+++ b/config-arm-highbank
@@ -1,16 +1,25 @@
 CONFIG_ARCH_HIGHBANK=y
 # CONFIG_ARM_LPAE is not set
+CONFIG_USE_GENERIC_SMP_HELPERS=y
+CONFIG_HAVE_SMP=y
+CONFIG_SMP=y
+CONFIG_SMP_ON_UP=y
 # CONFIG_ARM_THUMBEE is not set
 CONFIG_SWP_EMULATE=y
-# CONFIG_CPU_BPREDICT_DISABLE is not set
 # CONFIG_ARM_ERRATA_430973 is not set
 # CONFIG_ARM_ERRATA_458693 is not set
 # CONFIG_ARM_ERRATA_460075 is not set
+# CONFIG_ARM_ERRATA_742230 is not set
+# CONFIG_ARM_ERRATA_742231 is not set
 # CONFIG_PL310_ERRATA_588369 is not set
+CONFIG_ARM_ERRATA_720789=y
 # CONFIG_PL310_ERRATA_727915 is not set
 # CONFIG_ARM_ERRATA_743622 is not set
+CONFIG_ARM_ERRATA_751472=y
 # CONFIG_PL310_ERRATA_753970 is not set
 # CONFIG_ARM_ERRATA_754322 is not set
+# CONFIG_ARM_ERRATA_754327 is not set
+# CONFIG_ARM_ERRATA_764369 is not set
 # CONFIG_PL310_ERRATA_769419 is not set
 
 # CONFIG_THUMB2_KERNEL is not set
@@ -29,3 +38,11 @@ CONFIG_GPIO_PL061=y
 CONFIG_SERIAL_AMBA_PL010=y
 CONFIG_SERIAL_AMBA_PL010_CONSOLE=y
 
+# CONFIG_CPU_BPREDICT_DISABLE is not set
+CONFIG_ARM_CPU_TOPOLOGY=y
+# CONFIG_SCHED_SMT is not set
+# CONFIG_NET_SCHED is not set
+CONFIG_SCHED_MC=y
+CONFIG_NR_CPUS=4
+CONFIG_LOCAL_TIMERS=y
+CONFIG_MPCORE_WATCHDOG=y
diff --git a/highbank-various.patch b/highbank-various.patch
new file mode 100644
index 0000000..0b2f93c
--- /dev/null
+++ b/highbank-various.patch
@@ -0,0 +1,168 @@
+diff --git a/arch/arm/mach-highbank/Makefile b/arch/arm/mach-highbank/Makefile
+index bfff00d..a6fb6f9 100644
+--- a/arch/arm/mach-highbank/Makefile
++++ b/arch/arm/mach-highbank/Makefile
+@@ -1,4 +1,8 @@
+-obj-y					:= clock.o highbank.o system.o
++obj-y					:= clock.o highbank.o system.o smc.o
++
++plus_sec := $(call as-instr,.arch_extension sec,+sec)
++AFLAGS_smc.o				:=-Wa,-march=armv7-a$(plus_sec)
++
+ obj-$(CONFIG_DEBUG_HIGHBANK_UART)	+= lluart.o
+ obj-$(CONFIG_SMP)			+= platsmp.o
+ obj-$(CONFIG_LOCAL_TIMERS)		+= localtimer.o
+diff --git a/arch/arm/mach-highbank/core.h b/arch/arm/mach-highbank/core.h
+index 7e33fc9..bc7e77e 100644
+--- a/arch/arm/mach-highbank/core.h
++++ b/arch/arm/mach-highbank/core.h
+@@ -7,3 +7,4 @@ extern void highbank_lluart_map_io(void);
+ static inline void highbank_lluart_map_io(void) {}
+ #endif
+ 
++extern void highbank_smc1(int fn, int arg);
+diff --git a/arch/arm/mach-highbank/highbank.c b/arch/arm/mach-highbank/highbank.c
+index 612e866..6be0b2f 100644
+--- a/arch/arm/mach-highbank/highbank.c
++++ b/arch/arm/mach-highbank/highbank.c
+@@ -87,10 +87,25 @@ const static struct of_device_id irq_match[] = {
+ 	{}
+ };
+ 
++#ifdef CONFIG_CACHE_L2X0
++static void highbank_l2x0_disable(void)
++{
++	/* Disable PL310 L2 Cache controller */
++	highbank_smc1(0x102, 0x0);
++}
++#endif
++
++
+ static void __init highbank_init_irq(void)
+ {
+ 	of_irq_init(irq_match);
++
++#ifdef CONFIG_CACHE_L2X0
++	/* Enable PL310 L2 Cache controller */
++	highbank_smc1(0x102, 0x1);
+ 	l2x0_of_init(0, ~0UL);
++	outer_cache.disable = highbank_l2x0_disable;
++#endif
+ }
+ 
+ static struct clk_lookup lookups[] = {
+diff --git a/arch/arm/mach-highbank/smc.S b/arch/arm/mach-highbank/smc.S
+new file mode 100644
+index 0000000..8b11632
+--- /dev/null
++++ b/arch/arm/mach-highbank/smc.S
+@@ -0,0 +1,31 @@
++/*
++ * Copied from omap44xx-smc.S
++ * Copyright (C) 2010 Texas Instruments, Inc.
++ * Written by Santosh Shilimkar <santosh.shilimkar at ti.com>
++ *
++ *
++ * This program is free software,you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License version 2 as
++ * published by the Free Software Foundation.
++ */
++
++#include <linux/linkage.h>
++
++/*
++ * This is common routine to manage secure monitor API
++ * used to modify the PL310 secure registers.
++ * 'r0' contains the value to be modified and 'r12' contains
++ * the monitor API number. It uses few CPU registers
++ * internally and hence they need be backed up including
++ * link register "lr".
++ * Function signature : void omap_smc1(u32 fn, u32 arg)
++ */
++
++ENTRY(highbank_smc1)
++	stmfd   sp!, {r2-r12, lr}
++	mov	r12, r0
++	mov 	r0, r1
++	dsb
++	smc	#0
++	ldmfd   sp!, {r2-r12, pc}
++ENDPROC(highbank_smc1)
+diff --git a/drivers/net/ethernet/calxeda/xgmac.c b/drivers/net/ethernet/calxeda/xgmac.c
+index a733094..616d38b 100644
+--- a/drivers/net/ethernet/calxeda/xgmac.c
++++ b/drivers/net/ethernet/calxeda/xgmac.c
+@@ -210,7 +210,7 @@
+ #define DMA_INTR_ENA_TIE	0x00000001	/* Transmit Interrupt */
+ 
+ #define DMA_INTR_NORMAL		(DMA_INTR_ENA_NIE | DMA_INTR_ENA_RIE | \
+-				 DMA_INTR_ENA_TUE)
++				 DMA_INTR_ENA_TUE | DMA_INTR_ENA_TIE)
+ 
+ #define DMA_INTR_ABNORMAL	(DMA_INTR_ENA_AIE | DMA_INTR_ENA_FBE | \
+ 				 DMA_INTR_ENA_RWE | DMA_INTR_ENA_RSE | \
+@@ -926,6 +926,7 @@ static void xgmac_tx_err(struct xgmac_priv *priv)
+ 	desc_init_tx_desc(priv->dma_tx, DMA_TX_RING_SZ);
+ 	priv->tx_tail = 0;
+ 	priv->tx_head = 0;
++	writel(priv->dma_tx_phy, priv->base + XGMAC_DMA_TX_BASE_ADDR);
+ 	writel(reg | DMA_CONTROL_ST, priv->base + XGMAC_DMA_CONTROL);
+ 
+ 	writel(DMA_STATUS_TU | DMA_STATUS_TPS | DMA_STATUS_NIS | DMA_STATUS_AIS,
+@@ -965,7 +966,7 @@ static int xgmac_hw_init(struct net_device *dev)
+ 	writel(DMA_INTR_DEFAULT_MASK, ioaddr + XGMAC_DMA_INTR_ENA);
+ 
+ 	/* XGMAC requires AXI bus init. This is a 'magic number' for now */
+-	writel(0x000100E, ioaddr + XGMAC_DMA_AXI_BUS);
++	writel(0x0077000E, ioaddr + XGMAC_DMA_AXI_BUS);
+ 
+ 	ctrl |= XGMAC_CONTROL_DDIC | XGMAC_CONTROL_JE | XGMAC_CONTROL_ACS |
+ 		XGMAC_CONTROL_CAR;
+diff --git a/arch/arm/mm/Kconfig b/arch/arm/mm/Kconfig
+index 67f75a0..aeaf699 100644
+--- a/arch/arm/mm/Kconfig
++++ b/arch/arm/mm/Kconfig
+@@ -867,7 +867,7 @@ config ARM_L1_CACHE_SHIFT
+ config ARM_DMA_MEM_BUFFERABLE
+ 	bool "Use non-cacheable memory for DMA" if (CPU_V6 || CPU_V6K) && !CPU_V7
+ 	depends on !(MACH_REALVIEW_PB1176 || REALVIEW_EB_ARM11MP || \
+-		     MACH_REALVIEW_PB11MP)
++		     MACH_REALVIEW_PB11MP || ARCH_HIGHBANK)
+ 	default y if CPU_V6 || CPU_V6K || CPU_V7
+ 	help
+ 	  Historically, the kernel has used strongly ordered mappings to
+diff --git a/drivers/net/ethernet/calxeda/xgmac.c b/drivers/net/ethernet/calxeda/xgmac.c
+index 616d38b..02444be 100644
+--- a/drivers/net/ethernet/calxeda/xgmac.c
++++ b/drivers/net/ethernet/calxeda/xgmac.c
+@@ -332,7 +332,7 @@
+ #define DESC_BUFFER2_SZ_OFFSET	16
+ 
+ struct xgmac_dma_desc {
+-	__le32 flags;
++	volatile __le32 flags;
+ 	__le32 buf_size;
+ 	__le32 buf1_addr;		/* Buffer 1 Address Pointer */
+ 	__le32 buf2_addr;		/* Buffer 2 Address Pointer */
+@@ -451,15 +451,20 @@ static inline int desc_get_owner(struct xgmac_dma_desc *p)
+ static inline void desc_set_rx_owner(struct xgmac_dma_desc *p)
+ {
+ 	/* Clear all fields and set the owner */
++	wmb();
+ 	p->flags = cpu_to_le32(DESC_OWN);
++	wmb();
+ }
+ 
+ static inline void desc_set_tx_owner(struct xgmac_dma_desc *p, u32 flags)
+ {
+-	u32 tmpflags = le32_to_cpu(p->flags);
++	u32 tmpflags;
++	wmb();
++	tmpflags = le32_to_cpu(p->flags);
+ 	tmpflags &= TXDESC_END_RING;
+ 	tmpflags |= flags | DESC_OWN;
+ 	p->flags = cpu_to_le32(tmpflags);
++	wmb();
+ }
+ 
+ static inline int desc_get_tx_ls(struct xgmac_dma_desc *p)
diff --git a/kernel.spec b/kernel.spec
index aa3a86b..93e9aae 100644
--- a/kernel.spec
+++ b/kernel.spec
@@ -747,6 +747,7 @@ Patch21006: arm-beagle-usb-init.patch
 # ARM highbank patches
 # Highbank clock functions need to be EXPORT for module builds
 Patch21010: highbank-export-clock-functions.patch
+Patch21012: highbank-various.patch
 
 Patch21070: ext4-Support-check-none-nocheck-mount-options.patch
 
@@ -1541,6 +1542,7 @@ ApplyPatch xen-x86-Implement-x86_apic_ops.patch
 
 #Highbank clock functions
 ApplyPatch highbank-export-clock-functions.patch 
+ApplyPatch highbank-various.patch
 
 #rhbz 807632
 ApplyPatch libata-forbid-port-runtime-pm-by-default.patch
-- 
1.7.10.1



More information about the arm mailing list