[PATCH] ARM: L2 : Add maintainace by line helper functions
Shilimkar, Santosh
santosh.shilimkar at ti.com
Mon Jan 25 01:25:00 EST 2010
Russell,
Can below patches make way to patch system now ?
[PATCH] ARM: L2 : Add maintainace by line helper functions
[PATCH] ARM: L2 : Errata 588369: Clean & Invalidate do not invalidate clean lines
> -----Original Message-----
> From: Shilimkar, Santosh
> Sent: Wednesday, January 20, 2010 7:39 PM
> To: linux at arm.linux.org.uk
> Cc: linux-arm-kernel at lists.infradead.org; tony at atomide.com; Shilimkar, Santosh
> Subject: [PATCH] ARM: L2 : Add maintainace by line helper functions
>
> This patch adds the cache maintainance by line helper functions.
>
> Signed-off-by: Santosh Shilimkar <santosh.shilimkar at ti.com>
> Acked-by: Catalin Marinas <catalin.marinas at arm.com>
> ---
> arch/arm/mm/cache-l2x0.c | 36 ++++++++++++++++++++++++++----------
> 1 files changed, 26 insertions(+), 10 deletions(-)
>
> diff --git a/arch/arm/mm/cache-l2x0.c b/arch/arm/mm/cache-l2x0.c
> index cb8fc65..1a14d18 100644
> --- a/arch/arm/mm/cache-l2x0.c
> +++ b/arch/arm/mm/cache-l2x0.c
> @@ -42,6 +42,27 @@ static inline void cache_sync(void)
> cache_wait(base + L2X0_CACHE_SYNC, 1);
> }
>
> +static inline void l2x0_clean_line(unsigned long addr)
> +{
> + void __iomem *base = l2x0_base;
> + cache_wait(base + L2X0_CLEAN_LINE_PA, 1);
> + writel(addr, base + L2X0_CLEAN_LINE_PA);
> +}
> +
> +static inline void l2x0_inv_line(unsigned long addr)
> +{
> + void __iomem *base = l2x0_base;
> + cache_wait(base + L2X0_INV_LINE_PA, 1);
> + writel(addr, base + L2X0_INV_LINE_PA);
> +}
> +
> +static inline void l2x0_flush_line(unsigned long addr)
> +{
> + void __iomem *base = l2x0_base;
> + cache_wait(base + L2X0_CLEAN_INV_LINE_PA, 1);
> + writel(addr, base + L2X0_CLEAN_INV_LINE_PA);
> +}
> +
> static inline void l2x0_inv_all(void)
> {
> unsigned long flags;
> @@ -62,23 +83,20 @@ static void l2x0_inv_range(unsigned long start, unsigned long end)
> spin_lock_irqsave(&l2x0_lock, flags);
> if (start & (CACHE_LINE_SIZE - 1)) {
> start &= ~(CACHE_LINE_SIZE - 1);
> - cache_wait(base + L2X0_CLEAN_INV_LINE_PA, 1);
> - writel(start, base + L2X0_CLEAN_INV_LINE_PA);
> + l2x0_flush_line(start);
> start += CACHE_LINE_SIZE;
> }
>
> if (end & (CACHE_LINE_SIZE - 1)) {
> end &= ~(CACHE_LINE_SIZE - 1);
> - cache_wait(base + L2X0_CLEAN_INV_LINE_PA, 1);
> - writel(end, base + L2X0_CLEAN_INV_LINE_PA);
> + l2x0_flush_line(end);
> }
>
> while (start < end) {
> unsigned long blk_end = start + min(end - start, 4096UL);
>
> while (start < blk_end) {
> - cache_wait(base + L2X0_INV_LINE_PA, 1);
> - writel(start, base + L2X0_INV_LINE_PA);
> + l2x0_inv_line(start);
> start += CACHE_LINE_SIZE;
> }
>
> @@ -103,8 +121,7 @@ static void l2x0_clean_range(unsigned long start, unsigned long end)
> unsigned long blk_end = start + min(end - start, 4096UL);
>
> while (start < blk_end) {
> - cache_wait(base + L2X0_CLEAN_LINE_PA, 1);
> - writel(start, base + L2X0_CLEAN_LINE_PA);
> + l2x0_clean_line(start);
> start += CACHE_LINE_SIZE;
> }
>
> @@ -129,8 +146,7 @@ static void l2x0_flush_range(unsigned long start, unsigned long end)
> unsigned long blk_end = start + min(end - start, 4096UL);
>
> while (start < blk_end) {
> - cache_wait(base + L2X0_CLEAN_INV_LINE_PA, 1);
> - writel(start, base + L2X0_CLEAN_INV_LINE_PA);
> + l2x0_flush_line(start);
> start += CACHE_LINE_SIZE;
> }
>
> --
> 1.6.0.4
More information about the linux-arm-kernel
mailing list