From: David Howells The attached patch fixes the following issues with support for the FR55x CPUs: (1) The FR555 has a 64-byte cacheline size; everything else that we've come across has a 32-byte cacheline size. (2) Fix machine_restart() for FR55x. (3) Fix frv_cpu_suspend() for FR55x. Signed-Off-By: David Howells Signed-off-by: Mark Salter Signed-off-by: Andrew Morton --- 25-akpm/arch/frv/Kconfig | 5 +++ 25-akpm/arch/frv/kernel/head.S | 7 +++-- 25-akpm/arch/frv/kernel/process.c | 8 +++++- 25-akpm/arch/frv/kernel/setup.c | 4 +-- 25-akpm/arch/frv/kernel/sleep.S | 48 ++++++++++++++++++++++++++------------ 25-akpm/include/asm-frv/cache.h | 4 ++- 6 files changed, 54 insertions(+), 22 deletions(-) diff -puN arch/frv/Kconfig~frv-fr55x-cpu-support-fixes arch/frv/Kconfig --- 25/arch/frv/Kconfig~frv-fr55x-cpu-support-fixes Fri Dec 17 15:33:01 2004 +++ 25-akpm/arch/frv/Kconfig Fri Dec 17 15:33:01 2004 @@ -202,6 +202,11 @@ config CPU_FR551_COMPILE This causes appropriate flags to be passed to the compiler to optimise for the FR555 CPU +config FRV_L1_CACHE_SHIFT + int + default "5" if CPU_FR401 || CPU_FR405 || CPU_FR451 + default "6" if CPU_FR551 + endmenu choice diff -puN arch/frv/kernel/head.S~frv-fr55x-cpu-support-fixes arch/frv/kernel/head.S --- 25/arch/frv/kernel/head.S~frv-fr55x-cpu-support-fixes Fri Dec 17 15:33:01 2004 +++ 25-akpm/arch/frv/kernel/head.S Fri Dec 17 15:33:01 2004 @@ -1,6 +1,6 @@ /* head.S: kernel entry point for FR-V kernel * - * Copyright (C) 2003 Red Hat, Inc. All Rights Reserved. + * Copyright (C) 2003, 2004 Red Hat, Inc. All Rights Reserved. * Written by David Howells (dhowells@redhat.com) * * This program is free software; you can redistribute it and/or @@ -16,6 +16,7 @@ #include #include #include +#include #include "head.inc" ############################################################################### @@ -194,7 +195,7 @@ __head_do_sdram: bar jmpl @(gr18,gr0) - .balign 32 + .balign L1_CACHE_BYTES __head_move_sdram: cst gr20,@(gr14,gr0 ), cc4,#1 cst gr21,@(gr14,gr11), cc5,#1 @@ -208,7 +209,7 @@ __head_move_sdram: membar jmpl @(gr19,gr0) - .balign 32 + .balign L1_CACHE_BYTES __head_sdram_moved: icul gr18 add gr18,gr5,gr4 diff -puN arch/frv/kernel/process.c~frv-fr55x-cpu-support-fixes arch/frv/kernel/process.c --- 25/arch/frv/kernel/process.c~frv-fr55x-cpu-support-fixes Fri Dec 17 15:33:01 2004 +++ 25-akpm/arch/frv/kernel/process.c Fri Dec 17 15:33:01 2004 @@ -94,10 +94,16 @@ void cpu_idle(void) void machine_restart(char * __unused) { + unsigned long reset_addr; #ifdef CONFIG_GDBSTUB gdbstub_exit(0); #endif + if (PSR_IMPLE(__get_PSR()) == PSR_IMPLE_FR551) + reset_addr = 0xfefff500; + else + reset_addr = 0xfeff0500; + /* Software reset. */ asm volatile(" dcef @(gr0,gr0),1 ! membar !" " sti %1,@(%0,0) !" @@ -105,7 +111,7 @@ void machine_restart(char * __unused) " nop ! nop ! nop ! nop ! nop ! " " nop ! nop ! nop ! nop ! nop ! " " nop ! nop ! nop ! nop ! nop ! " - : : "r" (0xfeff0500), "r" (1) ); + : : "r" (reset_addr), "r" (1) ); for (;;) ; diff -puN arch/frv/kernel/setup.c~frv-fr55x-cpu-support-fixes arch/frv/kernel/setup.c --- 25/arch/frv/kernel/setup.c~frv-fr55x-cpu-support-fixes Fri Dec 17 15:33:01 2004 +++ 25-akpm/arch/frv/kernel/setup.c Fri Dec 17 15:33:01 2004 @@ -8,7 +8,7 @@ * Copyright (C) 1995 Hamish Macdonald * Copyright (C) 2000 Lineo Inc. (www.lineo.com) * Copyright (C) 2001 Lineo, Inc. - * Copyright (C) 2003 David Howells , Red Hat, Inc. + * Copyright (C) 2003,2004 David Howells , Red Hat, Inc. */ /* @@ -499,7 +499,7 @@ static void __init determine_cpu(void) case PSR_IMPLE_FR551: cpu_series = "fr550"; cpu_core = "fr551"; - pdm_suspend_mode = HSR0_PDM_PLL_STOP; + pdm_suspend_mode = HSR0_PDM_PLL_RUN; switch (PSR_VERSION(psr)) { case PSR_VERSION_FR551_MB93555: diff -puN arch/frv/kernel/sleep.S~frv-fr55x-cpu-support-fixes arch/frv/kernel/sleep.S --- 25/arch/frv/kernel/sleep.S~frv-fr55x-cpu-support-fixes Fri Dec 17 15:33:01 2004 +++ 25-akpm/arch/frv/kernel/sleep.S Fri Dec 17 15:33:01 2004 @@ -23,10 +23,14 @@ #define __addr_MASK 0xfeff9820 /* interrupt controller mask */ -#define __addr_SDRAMC 0xfe000400 /* SDRAM controller regs */ -#define SDRAMC_DSTS 0x28 /* SDRAM status */ -#define SDRAMC_DSTS_SSI 0x00000001 /* indicates that the SDRAM is in self-refresh mode */ -#define SDRAMC_DRCN 0x30 /* SDRAM refresh control */ +#define __addr_FR55X_DRCN 0xfeff0218 /* Address of DRCN register */ +#define FR55X_DSTS_OFFSET -4 /* Offset from DRCN to DSTS */ +#define FR55X_SDRAMC_DSTS_SSI 0x00000002 /* indicates that the SDRAM is in self-refresh mode */ + +#define __addr_FR4XX_DRCN 0xfe000430 /* Address of DRCN register */ +#define FR4XX_DSTS_OFFSET -8 /* Offset from DRCN to DSTS */ +#define FR4XX_SDRAMC_DSTS_SSI 0x00000001 /* indicates that the SDRAM is in self-refresh mode */ + #define SDRAMC_DRCN_SR 0x00000001 /* transition SDRAM into self-refresh mode */ .section .bss @@ -101,6 +105,19 @@ frv_cpu_suspend: movgs gr8,psr ori gr8,#PSR_ET,gr8 + srli gr8,#28,gr4 + subicc gr4,#3,gr0,icc0 + beq icc0,#0,1f + # FR4xx + li __addr_FR4XX_DRCN,gr4 + li FR4XX_SDRAMC_DSTS_SSI,gr5 + li FR4XX_DSTS_OFFSET,gr6 + bra __icache_lock_start +1: + # FR5xx + li __addr_FR55X_DRCN,gr4 + li FR55X_SDRAMC_DSTS_SSI,gr5 + li FR55X_DSTS_OFFSET,gr6 bra __icache_lock_start .size frv_cpu_suspend, .-frv_cpu_suspend @@ -118,7 +135,6 @@ __icache_lock_start: #---------------------------------------------------- # put SDRAM in self-refresh mode #---------------------------------------------------- - li __sleep_save_area,gr4 # Flush all data in the cache using the DCEF instruction. dcef @(gr0,gr0),#1 @@ -126,17 +142,17 @@ __icache_lock_start: # Stop DMAC transfer # Execute dummy load from SDRAM - ldi.p @(gr4,#0),gr4 + ldi @(gr11,#0),gr11 # put the SDRAM into self-refresh mode - setlos SDRAMC_DRCN_SR,gr3 - li __addr_SDRAMC,gr4 - sti gr3,@(gr4,#SDRAMC_DRCN) + ld @(gr4,gr0),gr11 + ori gr11,#SDRAMC_DRCN_SR,gr11 + st gr11,@(gr4,gr0) membar # wait for SDRAM to reach self-refresh mode -1: ldi @(gr4,#SDRAMC_DSTS),gr3 - andicc gr3,#SDRAMC_DSTS_SSI,gr3,icc0 +1: ld @(gr4,gr6),gr11 + andcc gr11,gr5,gr11,icc0 beq icc0,#0,1b # Set the GPIO register so that the IRQ[3:0] pins become valid, as required. @@ -173,11 +189,13 @@ __icache_lock_start: #---------------------------------------------------- # wake SDRAM from self-refresh mode #---------------------------------------------------- - li __addr_SDRAMC,gr4 - sti gr0,@(gr4,#SDRAMC_DRCN) // Turn off self-refresh. + ld @(gr4,gr0),gr11 + andi gr11,#~SDRAMC_DRCN_SR,gr11 + st gr11,@(gr4,gr0) + membar 2: - ldi @(gr4,#SDRAMC_DSTS),gr3 // Wait for it to come back... - andicc gr3,#SDRAMC_DSTS_SSI,gr0,icc0 + ld @(gr4,gr6),gr11 // Wait for it to come back... + andcc gr11,gr5,gr0,icc0 bne icc0,0,2b # wait for the SDRAM to stabilise diff -puN include/asm-frv/cache.h~frv-fr55x-cpu-support-fixes include/asm-frv/cache.h --- 25/include/asm-frv/cache.h~frv-fr55x-cpu-support-fixes Fri Dec 17 15:33:01 2004 +++ 25-akpm/include/asm-frv/cache.h Fri Dec 17 15:33:01 2004 @@ -12,8 +12,10 @@ #ifndef __ASM_CACHE_H #define __ASM_CACHE_H +#include + /* bytes per L1 cache line */ -#define L1_CACHE_SHIFT 5 +#define L1_CACHE_SHIFT (CONFIG_FRV_L1_CACHE_SHIFT) #define L1_CACHE_BYTES (1 << L1_CACHE_SHIFT) #define __cacheline_aligned __attribute__((aligned(L1_CACHE_BYTES))) _