Re: [U-Boot] [PATCH] powerpc/mpc85xx: Add workaround to enable TDM on T1040

2014-06-11 Thread York Sun
On 06/05/2014 06:19 AM, Sandeep Singh wrote:
 This is a workaround for 32 bit hardware limitation of TDM.
 T1040 has 36 bit physical addressing, TDM DMAC register
 are 32 bit wide but need to store address of CCSR space
 which lies beyond 32 bit address range. This workaround
 creats a LAW to enable access of TDM DMA to CCSR by
 mapping CCSR to overlap with DDR.
 A hole of 16M is created in memory using device tree. This
 workaround law is set only if tdm is defined in hwconfig.
 Also disable POST tests and add LIODN for TDM
 
 Signed-off-by: Sandeep Singh sand...@freescale.com
 Cc: York Sun york...@freescale.com
 ---


Applied to u-boot-mpc85xx. Sorry for the late notice.

York

___
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot


[U-Boot] [PATCH] powerpc/mpc85xx: Add workaround to enable TDM on T1040

2014-06-05 Thread Sandeep Singh
This is a workaround for 32 bit hardware limitation of TDM.
T1040 has 36 bit physical addressing, TDM DMAC register
are 32 bit wide but need to store address of CCSR space
which lies beyond 32 bit address range. This workaround
creats a LAW to enable access of TDM DMA to CCSR by
mapping CCSR to overlap with DDR.
A hole of 16M is created in memory using device tree. This
workaround law is set only if tdm is defined in hwconfig.
Also disable POST tests and add LIODN for TDM

Signed-off-by: Sandeep Singh sand...@freescale.com
Cc: York Sun york...@freescale.com
---
 arch/powerpc/cpu/mpc85xx/cpu_init.c   |   29 +
 arch/powerpc/cpu/mpc85xx/fdt.c|   26 ++
 arch/powerpc/cpu/mpc85xx/t1040_ids.c  |1 +
 arch/powerpc/include/asm/fsl_law.h|1 +
 arch/powerpc/include/asm/fsl_liodn.h  |4 
 arch/powerpc/include/asm/immap_85xx.h |4 +++-
 include/configs/T1040QDS.h|6 ++
 include/configs/T104xRDB.h|6 ++
 8 files changed, 76 insertions(+), 1 deletions(-)

diff --git a/arch/powerpc/cpu/mpc85xx/cpu_init.c 
b/arch/powerpc/cpu/mpc85xx/cpu_init.c
index d6cf885..78316a6 100644
--- a/arch/powerpc/cpu/mpc85xx/cpu_init.c
+++ b/arch/powerpc/cpu/mpc85xx/cpu_init.c
@@ -225,6 +225,32 @@ static void disable_cpc_sram(void)
 }
 #endif
 
+#if defined(T1040_TDM_QUIRK_CCSR_BASE)
+#ifdef CONFIG_POST
+#error POST memory test cannot be enabled with TDM
+#endif
+static void enable_tdm_law(void)
+{
+   int ret;
+   char buffer[HWCONFIG_BUFFER_SIZE] = {0};
+   int tdm_hwconfig_enabled = 0;
+
+   /*
+* Extract hwconfig from environment since environment
+* is not setup properly yet. Search for tdm entry in
+* hwconfig.
+*/
+   ret = getenv_f(hwconfig, buffer, sizeof(buffer));
+   if (ret  0) {
+   tdm_hwconfig_enabled = hwconfig_f(tdm, buffer);
+   /* If tdm is defined in hwconfig, set law for tdm workaround */
+   if (tdm_hwconfig_enabled)
+   set_next_law(T1040_TDM_QUIRK_CCSR_BASE, LAW_SIZE_16M,
+LAW_TRGT_IF_CCSR);
+   }
+}
+#endif
+
 static void enable_cpc(void)
 {
int i;
@@ -729,6 +755,9 @@ skip_l2:
disable_cpc_sram();
 #endif
enable_cpc();
+#if defined(T1040_TDM_QUIRK_CCSR_BASE)
+   enable_tdm_law();
+#endif
 
 #ifndef CONFIG_SYS_FSL_NO_SERDES
/* needs to be in ram since code uses global static vars */
diff --git a/arch/powerpc/cpu/mpc85xx/fdt.c b/arch/powerpc/cpu/mpc85xx/fdt.c
index ed80a84..85dfa5b 100644
--- a/arch/powerpc/cpu/mpc85xx/fdt.c
+++ b/arch/powerpc/cpu/mpc85xx/fdt.c
@@ -14,6 +14,7 @@
 #include linux/ctype.h
 #include asm/io.h
 #include asm/fsl_portals.h
+#include hwconfig.h
 #ifdef CONFIG_FSL_ESDHC
 #include fsl_esdhc.h
 #endif
@@ -35,6 +36,11 @@ void ft_fixup_cpu(void *blob, u64 memory_limit)
u32 bootpg = determine_mp_bootpg(NULL);
u32 id = get_my_id();
const char *enable_method;
+#if defined(T1040_TDM_QUIRK_CCSR_BASE)
+   int ret;
+   int tdm_hwconfig_enabled = 0;
+   char buffer[HWCONFIG_BUFFER_SIZE] = {0};
+#endif
 
off = fdt_node_offset_by_prop_value(blob, -1, device_type, cpu, 4);
while (off != -FDT_ERR_NOTFOUND) {
@@ -77,6 +83,26 @@ void ft_fixup_cpu(void *blob, u64 memory_limit)
device_type, cpu, 4);
}
 
+#if defined(T1040_TDM_QUIRK_CCSR_BASE)
+#defineCONFIG_MEM_HOLE_16M 0x100
+   /*
+* Extract hwconfig from environment.
+* Search for tdm entry in hwconfig.
+*/
+   ret = getenv_f(hwconfig, buffer, sizeof(buffer));
+   if (ret  0)
+   tdm_hwconfig_enabled = hwconfig_f(tdm, buffer);
+
+   /* Reserve the memory hole created by TDM LAW, so OSes dont use it */
+   if (tdm_hwconfig_enabled) {
+   off = fdt_add_mem_rsv(blob, T1040_TDM_QUIRK_CCSR_BASE,
+ CONFIG_MEM_HOLE_16M);
+   if (off  0)
+   printf(Failed  to reserve memory for tdm: %s\n,
+  fdt_strerror(off));
+   }
+#endif
+
/* Reserve the boot page so OSes dont use it */
if ((u64)bootpg  memory_limit) {
off = fdt_add_mem_rsv(blob, bootpg, (u64)4096);
diff --git a/arch/powerpc/cpu/mpc85xx/t1040_ids.c 
b/arch/powerpc/cpu/mpc85xx/t1040_ids.c
index 1034cd4..a5dfb81 100644
--- a/arch/powerpc/cpu/mpc85xx/t1040_ids.c
+++ b/arch/powerpc/cpu/mpc85xx/t1040_ids.c
@@ -47,6 +47,7 @@ struct liodn_id_table liodn_tbl[] = {
 
/* SET_NEXUS_LIODN(557), -- not yet implemented */
SET_QE_LIODN(559),
+   SET_TDM_LIODN(560),
 };
 int liodn_tbl_sz = ARRAY_SIZE(liodn_tbl);
 
diff --git a/arch/powerpc/include/asm/fsl_law.h 
b/arch/powerpc/include/asm/fsl_law.h
index 37d3a22..3b50487 100644
--- a/arch/powerpc/include/asm/fsl_law.h
+++ b/arch/powerpc/include/asm/fsl_law.h
@@