From: Kevin Hilman <khilman@ti.com>
To: jean.pihet@newoldbits.com
Cc: Dave Martin <dave.martin@linaro.org>,
Russell King - ARM Linux <linux@arm.linux.org.uk>,
linux-arm-kernel@lists.infradead.org, linux-omap@vger.kernel.org,
Jean Pihet <j-pihet@ti.com>
Subject: Re: [PATCH v2] OMAP: use fncpy to copy the PM code functions to SRAM
Date: Wed, 19 Jan 2011 10:31:33 -0800 [thread overview]
Message-ID: <87vd1ksq2i.fsf@ti.com> (raw)
In-Reply-To: <1295352126-29171-1-git-send-email-j-pihet@ti.com> (jean pihet's message of "Tue, 18 Jan 2011 13:02:06 +0100")
jean.pihet@newoldbits.com writes:
> From: Jean Pihet <j-pihet@ti.com>
>
> The new fncpy API is better suited for copying some
> code to SRAM at runtime. This patch changes the ad-hoc
> code to the more generic fncpy API.
>
> Tested OK on OMAP3 in low power modes (RET/OFF)
> using omap2plus_defconfig with !CONFIG_THUMB2_KERNEL.
> Compile tested on OMAP1/2 using omap1_defconfig.
>
> Signed-off-by: Jean Pihet <j-pihet@ti.com>
Acked-by: Kevin Hilman <khilman@ti.com>
Boot tested on OMAP1 & OMAP2 as well. Note that neither OMAP1 or OMAP2
has had working suspend/resume for a long time now, so I did not test
suspend/resume.
Kevin
> ---
> arch/arm/mach-omap1/pm.h | 6 +++---
> arch/arm/mach-omap1/sleep.S | 3 +++
> arch/arm/mach-omap1/sram.S | 1 +
> arch/arm/mach-omap2/pm.h | 2 +-
> arch/arm/mach-omap2/sleep24xx.S | 2 ++
> arch/arm/mach-omap2/sleep34xx.S | 2 ++
> arch/arm/mach-omap2/sram242x.S | 3 +++
> arch/arm/mach-omap2/sram243x.S | 3 +++
> arch/arm/mach-omap2/sram34xx.S | 1 +
> arch/arm/plat-omap/include/plat/sram.h | 14 +++++++++++++-
> arch/arm/plat-omap/sram.c | 14 +++++++++-----
> 11 files changed, 41 insertions(+), 10 deletions(-)
>
> diff --git a/arch/arm/mach-omap1/pm.h b/arch/arm/mach-omap1/pm.h
> index 56a6479..cd926dc 100644
> --- a/arch/arm/mach-omap1/pm.h
> +++ b/arch/arm/mach-omap1/pm.h
> @@ -123,9 +123,9 @@ extern void allow_idle_sleep(void);
> extern void omap1_pm_idle(void);
> extern void omap1_pm_suspend(void);
>
> -extern void omap7xx_cpu_suspend(unsigned short, unsigned short);
> -extern void omap1510_cpu_suspend(unsigned short, unsigned short);
> -extern void omap1610_cpu_suspend(unsigned short, unsigned short);
> +extern void omap7xx_cpu_suspend(unsigned long, unsigned long);
> +extern void omap1510_cpu_suspend(unsigned long, unsigned long);
> +extern void omap1610_cpu_suspend(unsigned long, unsigned long);
> extern void omap7xx_idle_loop_suspend(void);
> extern void omap1510_idle_loop_suspend(void);
> extern void omap1610_idle_loop_suspend(void);
> diff --git a/arch/arm/mach-omap1/sleep.S b/arch/arm/mach-omap1/sleep.S
> index ef771ce..c875bdc 100644
> --- a/arch/arm/mach-omap1/sleep.S
> +++ b/arch/arm/mach-omap1/sleep.S
> @@ -58,6 +58,7 @@
> */
>
> #if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850)
> + .align 3
> ENTRY(omap7xx_cpu_suspend)
>
> @ save registers on stack
> @@ -137,6 +138,7 @@ ENTRY(omap7xx_cpu_suspend_sz)
> #endif /* CONFIG_ARCH_OMAP730 || CONFIG_ARCH_OMAP850 */
>
> #ifdef CONFIG_ARCH_OMAP15XX
> + .align 3
> ENTRY(omap1510_cpu_suspend)
>
> @ save registers on stack
> @@ -211,6 +213,7 @@ ENTRY(omap1510_cpu_suspend_sz)
> #endif /* CONFIG_ARCH_OMAP15XX */
>
> #if defined(CONFIG_ARCH_OMAP16XX)
> + .align 3
> ENTRY(omap1610_cpu_suspend)
>
> @ save registers on stack
> diff --git a/arch/arm/mach-omap1/sram.S b/arch/arm/mach-omap1/sram.S
> index 7724e52..692587d 100644
> --- a/arch/arm/mach-omap1/sram.S
> +++ b/arch/arm/mach-omap1/sram.S
> @@ -18,6 +18,7 @@
> /*
> * Reprograms ULPD and CKCTL.
> */
> + .align 3
> ENTRY(omap1_sram_reprogram_clock)
> stmfd sp!, {r0 - r12, lr} @ save registers on stack
>
> diff --git a/arch/arm/mach-omap2/pm.h b/arch/arm/mach-omap2/pm.h
> index 1c1b0ab..39580e6 100644
> --- a/arch/arm/mach-omap2/pm.h
> +++ b/arch/arm/mach-omap2/pm.h
> @@ -92,7 +92,7 @@ extern void omap24xx_idle_loop_suspend(void);
> extern void omap24xx_cpu_suspend(u32 dll_ctrl, void __iomem *sdrc_dlla_ctrl,
> void __iomem *sdrc_power);
> extern void omap34xx_cpu_suspend(u32 *addr, int save_state);
> -extern void save_secure_ram_context(u32 *addr);
> +extern int save_secure_ram_context(u32 *addr);
> extern void omap3_save_scratchpad_contents(void);
>
> extern unsigned int omap24xx_idle_loop_suspend_sz;
> diff --git a/arch/arm/mach-omap2/sleep24xx.S b/arch/arm/mach-omap2/sleep24xx.S
> index c7780cc..b5071a4 100644
> --- a/arch/arm/mach-omap2/sleep24xx.S
> +++ b/arch/arm/mach-omap2/sleep24xx.S
> @@ -47,6 +47,7 @@
> * Note: This code get's copied to internal SRAM at boot. When the OMAP
> * wakes up it continues execution at the point it went to sleep.
> */
> + .align 3
> ENTRY(omap24xx_idle_loop_suspend)
> stmfd sp!, {r0, lr} @ save registers on stack
> mov r0, #0 @ clear for mcr setup
> @@ -82,6 +83,7 @@ ENTRY(omap24xx_idle_loop_suspend_sz)
> * The DLL load value is not kept in RETENTION or OFF. It needs to be restored
> * at wake
> */
> + .align 3
> ENTRY(omap24xx_cpu_suspend)
> stmfd sp!, {r0 - r12, lr} @ save registers on stack
> mov r3, #0x0 @ clear for mcr call
> diff --git a/arch/arm/mach-omap2/sleep34xx.S b/arch/arm/mach-omap2/sleep34xx.S
> index 98d8232..951a0be 100644
> --- a/arch/arm/mach-omap2/sleep34xx.S
> +++ b/arch/arm/mach-omap2/sleep34xx.S
> @@ -118,6 +118,7 @@ ENTRY(enable_omap3630_toggle_l2_on_restore)
>
> .text
> /* Function to call rom code to save secure ram context */
> + .align 3
> ENTRY(save_secure_ram_context)
> stmfd sp!, {r1-r12, lr} @ save registers on stack
> adr r3, api_params @ r3 points to parameters
> @@ -169,6 +170,7 @@ ENTRY(save_secure_ram_context_sz)
> * depending on the low power mode (non-OFF vs OFF modes),
> * cf. 'Resume path for xxx mode' comments.
> */
> + .align 3
> ENTRY(omap34xx_cpu_suspend)
> stmfd sp!, {r0-r12, lr} @ save registers on stack
>
> diff --git a/arch/arm/mach-omap2/sram242x.S b/arch/arm/mach-omap2/sram242x.S
> index 055310c..ff9b9db 100644
> --- a/arch/arm/mach-omap2/sram242x.S
> +++ b/arch/arm/mach-omap2/sram242x.S
> @@ -39,6 +39,7 @@
>
> .text
>
> + .align 3
> ENTRY(omap242x_sram_ddr_init)
> stmfd sp!, {r0 - r12, lr} @ save registers on stack
>
> @@ -143,6 +144,7 @@ ENTRY(omap242x_sram_ddr_init_sz)
> * r0 = [PRCM_FULL | PRCM_HALF] r1 = SDRC_DLLA_CTRL value r2 = [DDR | SDR]
> * PRCM_FULL = 2, PRCM_HALF = 1, DDR = 1, SDR = 0
> */
> + .align 3
> ENTRY(omap242x_sram_reprogram_sdrc)
> stmfd sp!, {r0 - r10, lr} @ save registers on stack
> mov r3, #0x0 @ clear for mrc call
> @@ -238,6 +240,7 @@ ENTRY(omap242x_sram_reprogram_sdrc_sz)
> /*
> * Set dividers and pll. Also recalculate DLL value for DDR and unlock mode.
> */
> + .align 3
> ENTRY(omap242x_sram_set_prcm)
> stmfd sp!, {r0-r12, lr} @ regs to stack
> adr r4, pbegin @ addr of preload start
> diff --git a/arch/arm/mach-omap2/sram243x.S b/arch/arm/mach-omap2/sram243x.S
> index f900758..7673020 100644
> --- a/arch/arm/mach-omap2/sram243x.S
> +++ b/arch/arm/mach-omap2/sram243x.S
> @@ -39,6 +39,7 @@
>
> .text
>
> + .align 3
> ENTRY(omap243x_sram_ddr_init)
> stmfd sp!, {r0 - r12, lr} @ save registers on stack
>
> @@ -143,6 +144,7 @@ ENTRY(omap243x_sram_ddr_init_sz)
> * r0 = [PRCM_FULL | PRCM_HALF] r1 = SDRC_DLLA_CTRL value r2 = [DDR | SDR]
> * PRCM_FULL = 2, PRCM_HALF = 1, DDR = 1, SDR = 0
> */
> + .align 3
> ENTRY(omap243x_sram_reprogram_sdrc)
> stmfd sp!, {r0 - r10, lr} @ save registers on stack
> mov r3, #0x0 @ clear for mrc call
> @@ -238,6 +240,7 @@ ENTRY(omap243x_sram_reprogram_sdrc_sz)
> /*
> * Set dividers and pll. Also recalculate DLL value for DDR and unlock mode.
> */
> + .align 3
> ENTRY(omap243x_sram_set_prcm)
> stmfd sp!, {r0-r12, lr} @ regs to stack
> adr r4, pbegin @ addr of preload start
> diff --git a/arch/arm/mach-omap2/sram34xx.S b/arch/arm/mach-omap2/sram34xx.S
> index 7f893a2..25011ca 100644
> --- a/arch/arm/mach-omap2/sram34xx.S
> +++ b/arch/arm/mach-omap2/sram34xx.S
> @@ -111,6 +111,7 @@
> * since it will cause the ARM MMU to attempt to walk the page tables.
> * These crashes may be intermittent.
> */
> + .align 3
> ENTRY(omap3_sram_configure_core_dpll)
> stmfd sp!, {r1-r12, lr} @ store regs to stack
>
> diff --git a/arch/arm/plat-omap/include/plat/sram.h b/arch/arm/plat-omap/include/plat/sram.h
> index 9967d5e..d673f2c 100644
> --- a/arch/arm/plat-omap/include/plat/sram.h
> +++ b/arch/arm/plat-omap/include/plat/sram.h
> @@ -12,7 +12,19 @@
> #define __ARCH_ARM_OMAP_SRAM_H
>
> #ifndef __ASSEMBLY__
> -extern void * omap_sram_push(void * start, unsigned long size);
> +#include <asm/fncpy.h>
> +
> +extern void *omap_sram_push_address(unsigned long size);
> +
> +/* Macro to push a function to the internal SRAM, using the fncpy API */
> +#define omap_sram_push(funcp, size) ({ \
> + typeof(&funcp) _res = NULL; \
> + void *_sram_address = omap_sram_push_address(size); \
> + if (_sram_address) \
> + _res = fncpy(_sram_address, &funcp, size); \
> + _res; \
> +})
> +
> extern void omap_sram_reprogram_clock(u32 dpllctl, u32 ckctl);
>
> extern void omap2_sram_ddr_init(u32 *slow_dll_ctrl, u32 fast_dll_ctrl,
> diff --git a/arch/arm/plat-omap/sram.c b/arch/arm/plat-omap/sram.c
> index e26e504..68fcc7d 100644
> --- a/arch/arm/plat-omap/sram.c
> +++ b/arch/arm/plat-omap/sram.c
> @@ -242,7 +242,14 @@ static void __init omap_map_sram(void)
> omap_sram_size - SRAM_BOOTLOADER_SZ);
> }
>
> -void * omap_sram_push(void * start, unsigned long size)
> +/*
> + * Memory allocator for SRAM: calculates the new ceiling address
> + * for pushing a function using the fncpy API.
> + *
> + * Note that fncpy requires the returned address to be aligned
> + * to an 8-byte boundary.
> + */
> +void *omap_sram_push_address(unsigned long size)
> {
> if (size > (omap_sram_ceil - (omap_sram_base + SRAM_BOOTLOADER_SZ))) {
> printk(KERN_ERR "Not enough space in SRAM\n");
> @@ -250,10 +257,7 @@ void * omap_sram_push(void * start, unsigned long size)
> }
>
> omap_sram_ceil -= size;
> - omap_sram_ceil = ROUND_DOWN(omap_sram_ceil, sizeof(void *));
> - memcpy((void *)omap_sram_ceil, start, size);
> - flush_icache_range((unsigned long)omap_sram_ceil,
> - (unsigned long)(omap_sram_ceil + size));
> + omap_sram_ceil = ROUND_DOWN(omap_sram_ceil, FNCPY_ALIGN);
>
> return (void *)omap_sram_ceil;
> }
WARNING: multiple messages have this Message-ID (diff)
From: khilman@ti.com (Kevin Hilman)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH v2] OMAP: use fncpy to copy the PM code functions to SRAM
Date: Wed, 19 Jan 2011 10:31:33 -0800 [thread overview]
Message-ID: <87vd1ksq2i.fsf@ti.com> (raw)
In-Reply-To: <1295352126-29171-1-git-send-email-j-pihet@ti.com> (jean pihet's message of "Tue, 18 Jan 2011 13:02:06 +0100")
jean.pihet at newoldbits.com writes:
> From: Jean Pihet <j-pihet@ti.com>
>
> The new fncpy API is better suited for copying some
> code to SRAM at runtime. This patch changes the ad-hoc
> code to the more generic fncpy API.
>
> Tested OK on OMAP3 in low power modes (RET/OFF)
> using omap2plus_defconfig with !CONFIG_THUMB2_KERNEL.
> Compile tested on OMAP1/2 using omap1_defconfig.
>
> Signed-off-by: Jean Pihet <j-pihet@ti.com>
Acked-by: Kevin Hilman <khilman@ti.com>
Boot tested on OMAP1 & OMAP2 as well. Note that neither OMAP1 or OMAP2
has had working suspend/resume for a long time now, so I did not test
suspend/resume.
Kevin
> ---
> arch/arm/mach-omap1/pm.h | 6 +++---
> arch/arm/mach-omap1/sleep.S | 3 +++
> arch/arm/mach-omap1/sram.S | 1 +
> arch/arm/mach-omap2/pm.h | 2 +-
> arch/arm/mach-omap2/sleep24xx.S | 2 ++
> arch/arm/mach-omap2/sleep34xx.S | 2 ++
> arch/arm/mach-omap2/sram242x.S | 3 +++
> arch/arm/mach-omap2/sram243x.S | 3 +++
> arch/arm/mach-omap2/sram34xx.S | 1 +
> arch/arm/plat-omap/include/plat/sram.h | 14 +++++++++++++-
> arch/arm/plat-omap/sram.c | 14 +++++++++-----
> 11 files changed, 41 insertions(+), 10 deletions(-)
>
> diff --git a/arch/arm/mach-omap1/pm.h b/arch/arm/mach-omap1/pm.h
> index 56a6479..cd926dc 100644
> --- a/arch/arm/mach-omap1/pm.h
> +++ b/arch/arm/mach-omap1/pm.h
> @@ -123,9 +123,9 @@ extern void allow_idle_sleep(void);
> extern void omap1_pm_idle(void);
> extern void omap1_pm_suspend(void);
>
> -extern void omap7xx_cpu_suspend(unsigned short, unsigned short);
> -extern void omap1510_cpu_suspend(unsigned short, unsigned short);
> -extern void omap1610_cpu_suspend(unsigned short, unsigned short);
> +extern void omap7xx_cpu_suspend(unsigned long, unsigned long);
> +extern void omap1510_cpu_suspend(unsigned long, unsigned long);
> +extern void omap1610_cpu_suspend(unsigned long, unsigned long);
> extern void omap7xx_idle_loop_suspend(void);
> extern void omap1510_idle_loop_suspend(void);
> extern void omap1610_idle_loop_suspend(void);
> diff --git a/arch/arm/mach-omap1/sleep.S b/arch/arm/mach-omap1/sleep.S
> index ef771ce..c875bdc 100644
> --- a/arch/arm/mach-omap1/sleep.S
> +++ b/arch/arm/mach-omap1/sleep.S
> @@ -58,6 +58,7 @@
> */
>
> #if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850)
> + .align 3
> ENTRY(omap7xx_cpu_suspend)
>
> @ save registers on stack
> @@ -137,6 +138,7 @@ ENTRY(omap7xx_cpu_suspend_sz)
> #endif /* CONFIG_ARCH_OMAP730 || CONFIG_ARCH_OMAP850 */
>
> #ifdef CONFIG_ARCH_OMAP15XX
> + .align 3
> ENTRY(omap1510_cpu_suspend)
>
> @ save registers on stack
> @@ -211,6 +213,7 @@ ENTRY(omap1510_cpu_suspend_sz)
> #endif /* CONFIG_ARCH_OMAP15XX */
>
> #if defined(CONFIG_ARCH_OMAP16XX)
> + .align 3
> ENTRY(omap1610_cpu_suspend)
>
> @ save registers on stack
> diff --git a/arch/arm/mach-omap1/sram.S b/arch/arm/mach-omap1/sram.S
> index 7724e52..692587d 100644
> --- a/arch/arm/mach-omap1/sram.S
> +++ b/arch/arm/mach-omap1/sram.S
> @@ -18,6 +18,7 @@
> /*
> * Reprograms ULPD and CKCTL.
> */
> + .align 3
> ENTRY(omap1_sram_reprogram_clock)
> stmfd sp!, {r0 - r12, lr} @ save registers on stack
>
> diff --git a/arch/arm/mach-omap2/pm.h b/arch/arm/mach-omap2/pm.h
> index 1c1b0ab..39580e6 100644
> --- a/arch/arm/mach-omap2/pm.h
> +++ b/arch/arm/mach-omap2/pm.h
> @@ -92,7 +92,7 @@ extern void omap24xx_idle_loop_suspend(void);
> extern void omap24xx_cpu_suspend(u32 dll_ctrl, void __iomem *sdrc_dlla_ctrl,
> void __iomem *sdrc_power);
> extern void omap34xx_cpu_suspend(u32 *addr, int save_state);
> -extern void save_secure_ram_context(u32 *addr);
> +extern int save_secure_ram_context(u32 *addr);
> extern void omap3_save_scratchpad_contents(void);
>
> extern unsigned int omap24xx_idle_loop_suspend_sz;
> diff --git a/arch/arm/mach-omap2/sleep24xx.S b/arch/arm/mach-omap2/sleep24xx.S
> index c7780cc..b5071a4 100644
> --- a/arch/arm/mach-omap2/sleep24xx.S
> +++ b/arch/arm/mach-omap2/sleep24xx.S
> @@ -47,6 +47,7 @@
> * Note: This code get's copied to internal SRAM at boot. When the OMAP
> * wakes up it continues execution at the point it went to sleep.
> */
> + .align 3
> ENTRY(omap24xx_idle_loop_suspend)
> stmfd sp!, {r0, lr} @ save registers on stack
> mov r0, #0 @ clear for mcr setup
> @@ -82,6 +83,7 @@ ENTRY(omap24xx_idle_loop_suspend_sz)
> * The DLL load value is not kept in RETENTION or OFF. It needs to be restored
> * at wake
> */
> + .align 3
> ENTRY(omap24xx_cpu_suspend)
> stmfd sp!, {r0 - r12, lr} @ save registers on stack
> mov r3, #0x0 @ clear for mcr call
> diff --git a/arch/arm/mach-omap2/sleep34xx.S b/arch/arm/mach-omap2/sleep34xx.S
> index 98d8232..951a0be 100644
> --- a/arch/arm/mach-omap2/sleep34xx.S
> +++ b/arch/arm/mach-omap2/sleep34xx.S
> @@ -118,6 +118,7 @@ ENTRY(enable_omap3630_toggle_l2_on_restore)
>
> .text
> /* Function to call rom code to save secure ram context */
> + .align 3
> ENTRY(save_secure_ram_context)
> stmfd sp!, {r1-r12, lr} @ save registers on stack
> adr r3, api_params @ r3 points to parameters
> @@ -169,6 +170,7 @@ ENTRY(save_secure_ram_context_sz)
> * depending on the low power mode (non-OFF vs OFF modes),
> * cf. 'Resume path for xxx mode' comments.
> */
> + .align 3
> ENTRY(omap34xx_cpu_suspend)
> stmfd sp!, {r0-r12, lr} @ save registers on stack
>
> diff --git a/arch/arm/mach-omap2/sram242x.S b/arch/arm/mach-omap2/sram242x.S
> index 055310c..ff9b9db 100644
> --- a/arch/arm/mach-omap2/sram242x.S
> +++ b/arch/arm/mach-omap2/sram242x.S
> @@ -39,6 +39,7 @@
>
> .text
>
> + .align 3
> ENTRY(omap242x_sram_ddr_init)
> stmfd sp!, {r0 - r12, lr} @ save registers on stack
>
> @@ -143,6 +144,7 @@ ENTRY(omap242x_sram_ddr_init_sz)
> * r0 = [PRCM_FULL | PRCM_HALF] r1 = SDRC_DLLA_CTRL value r2 = [DDR | SDR]
> * PRCM_FULL = 2, PRCM_HALF = 1, DDR = 1, SDR = 0
> */
> + .align 3
> ENTRY(omap242x_sram_reprogram_sdrc)
> stmfd sp!, {r0 - r10, lr} @ save registers on stack
> mov r3, #0x0 @ clear for mrc call
> @@ -238,6 +240,7 @@ ENTRY(omap242x_sram_reprogram_sdrc_sz)
> /*
> * Set dividers and pll. Also recalculate DLL value for DDR and unlock mode.
> */
> + .align 3
> ENTRY(omap242x_sram_set_prcm)
> stmfd sp!, {r0-r12, lr} @ regs to stack
> adr r4, pbegin @ addr of preload start
> diff --git a/arch/arm/mach-omap2/sram243x.S b/arch/arm/mach-omap2/sram243x.S
> index f900758..7673020 100644
> --- a/arch/arm/mach-omap2/sram243x.S
> +++ b/arch/arm/mach-omap2/sram243x.S
> @@ -39,6 +39,7 @@
>
> .text
>
> + .align 3
> ENTRY(omap243x_sram_ddr_init)
> stmfd sp!, {r0 - r12, lr} @ save registers on stack
>
> @@ -143,6 +144,7 @@ ENTRY(omap243x_sram_ddr_init_sz)
> * r0 = [PRCM_FULL | PRCM_HALF] r1 = SDRC_DLLA_CTRL value r2 = [DDR | SDR]
> * PRCM_FULL = 2, PRCM_HALF = 1, DDR = 1, SDR = 0
> */
> + .align 3
> ENTRY(omap243x_sram_reprogram_sdrc)
> stmfd sp!, {r0 - r10, lr} @ save registers on stack
> mov r3, #0x0 @ clear for mrc call
> @@ -238,6 +240,7 @@ ENTRY(omap243x_sram_reprogram_sdrc_sz)
> /*
> * Set dividers and pll. Also recalculate DLL value for DDR and unlock mode.
> */
> + .align 3
> ENTRY(omap243x_sram_set_prcm)
> stmfd sp!, {r0-r12, lr} @ regs to stack
> adr r4, pbegin @ addr of preload start
> diff --git a/arch/arm/mach-omap2/sram34xx.S b/arch/arm/mach-omap2/sram34xx.S
> index 7f893a2..25011ca 100644
> --- a/arch/arm/mach-omap2/sram34xx.S
> +++ b/arch/arm/mach-omap2/sram34xx.S
> @@ -111,6 +111,7 @@
> * since it will cause the ARM MMU to attempt to walk the page tables.
> * These crashes may be intermittent.
> */
> + .align 3
> ENTRY(omap3_sram_configure_core_dpll)
> stmfd sp!, {r1-r12, lr} @ store regs to stack
>
> diff --git a/arch/arm/plat-omap/include/plat/sram.h b/arch/arm/plat-omap/include/plat/sram.h
> index 9967d5e..d673f2c 100644
> --- a/arch/arm/plat-omap/include/plat/sram.h
> +++ b/arch/arm/plat-omap/include/plat/sram.h
> @@ -12,7 +12,19 @@
> #define __ARCH_ARM_OMAP_SRAM_H
>
> #ifndef __ASSEMBLY__
> -extern void * omap_sram_push(void * start, unsigned long size);
> +#include <asm/fncpy.h>
> +
> +extern void *omap_sram_push_address(unsigned long size);
> +
> +/* Macro to push a function to the internal SRAM, using the fncpy API */
> +#define omap_sram_push(funcp, size) ({ \
> + typeof(&funcp) _res = NULL; \
> + void *_sram_address = omap_sram_push_address(size); \
> + if (_sram_address) \
> + _res = fncpy(_sram_address, &funcp, size); \
> + _res; \
> +})
> +
> extern void omap_sram_reprogram_clock(u32 dpllctl, u32 ckctl);
>
> extern void omap2_sram_ddr_init(u32 *slow_dll_ctrl, u32 fast_dll_ctrl,
> diff --git a/arch/arm/plat-omap/sram.c b/arch/arm/plat-omap/sram.c
> index e26e504..68fcc7d 100644
> --- a/arch/arm/plat-omap/sram.c
> +++ b/arch/arm/plat-omap/sram.c
> @@ -242,7 +242,14 @@ static void __init omap_map_sram(void)
> omap_sram_size - SRAM_BOOTLOADER_SZ);
> }
>
> -void * omap_sram_push(void * start, unsigned long size)
> +/*
> + * Memory allocator for SRAM: calculates the new ceiling address
> + * for pushing a function using the fncpy API.
> + *
> + * Note that fncpy requires the returned address to be aligned
> + * to an 8-byte boundary.
> + */
> +void *omap_sram_push_address(unsigned long size)
> {
> if (size > (omap_sram_ceil - (omap_sram_base + SRAM_BOOTLOADER_SZ))) {
> printk(KERN_ERR "Not enough space in SRAM\n");
> @@ -250,10 +257,7 @@ void * omap_sram_push(void * start, unsigned long size)
> }
>
> omap_sram_ceil -= size;
> - omap_sram_ceil = ROUND_DOWN(omap_sram_ceil, sizeof(void *));
> - memcpy((void *)omap_sram_ceil, start, size);
> - flush_icache_range((unsigned long)omap_sram_ceil,
> - (unsigned long)(omap_sram_ceil + size));
> + omap_sram_ceil = ROUND_DOWN(omap_sram_ceil, FNCPY_ALIGN);
>
> return (void *)omap_sram_ceil;
> }
next prev parent reply other threads:[~2011-01-19 18:31 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-01-18 12:02 [PATCH v2] OMAP: use fncpy to copy the PM code functions to SRAM jean.pihet
2011-01-18 12:02 ` jean.pihet at newoldbits.com
2011-01-19 18:31 ` Kevin Hilman [this message]
2011-01-19 18:31 ` Kevin Hilman
2011-01-19 21:38 ` Kevin Hilman
2011-01-19 21:38 ` Kevin Hilman
2011-01-19 22:10 ` Tony Lindgren
2011-01-19 22:10 ` Tony Lindgren
2011-01-20 13:14 ` Jean Pihet
2011-01-20 13:14 ` Jean Pihet
2011-01-24 16:11 ` Dave Martin
2011-01-24 16:11 ` Dave Martin
2011-01-24 17:25 ` Jean Pihet
2011-01-24 17:25 ` Jean Pihet
2011-01-25 10:33 ` Dave Martin
2011-01-25 10:33 ` Dave Martin
2011-01-25 17:22 ` Jean Pihet
2011-01-25 17:22 ` Jean Pihet
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87vd1ksq2i.fsf@ti.com \
--to=khilman@ti.com \
--cc=dave.martin@linaro.org \
--cc=j-pihet@ti.com \
--cc=jean.pihet@newoldbits.com \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-omap@vger.kernel.org \
--cc=linux@arm.linux.org.uk \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.