mirror of
https://github.com/torvalds/linux.git
synced 2024-12-22 02:52:56 +00:00
f6f9be1c30
This patch adds support for the Broadcom Brahma-B15 CPU readahead cache controller. This cache controller sits between the L2 and the memory bus and its purpose is to provide a friendler burst size towards the DDR interface than the native cache line size. The readahead cache is mostly transparent, except for flush_kern_cache_all, which is precisely what we are overriding here. The readahead cache only intercepts reads, and does invalidate on writes (IOW), as such, some data can remain stale in any of its buffers, such that we need to flush it, which is an operation that needs to happen in a particular order: - disable the readahead cache - flush it - call the appropriate cache-v7.S function - re-enable This patch tries to minimize the impact to the cache-v7.S file by only providing a stub in case CONFIG_CACHE_B15_RAC is enabled (default for ARCH_BRCMSTB since it is the current user). Signed-off-by: Alamy Liu <alamyliu@broadcom.com> Signed-off-by: Florian Fainelli <f.fainelli@gmail.com> Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
165 lines
3.6 KiB
C
165 lines
3.6 KiB
C
/*
|
|
* arch/arm/include/asm/glue-cache.h
|
|
*
|
|
* Copyright (C) 1999-2002 Russell King
|
|
*
|
|
* 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.
|
|
*/
|
|
#ifndef ASM_GLUE_CACHE_H
|
|
#define ASM_GLUE_CACHE_H
|
|
|
|
#include <asm/glue.h>
|
|
|
|
/*
|
|
* Cache Model
|
|
* ===========
|
|
*/
|
|
#undef _CACHE
|
|
#undef MULTI_CACHE
|
|
|
|
#if defined(CONFIG_CPU_CACHE_V4)
|
|
# ifdef _CACHE
|
|
# define MULTI_CACHE 1
|
|
# else
|
|
# define _CACHE v4
|
|
# endif
|
|
#endif
|
|
|
|
#if defined(CONFIG_CPU_ARM920T) || defined(CONFIG_CPU_ARM922T) || \
|
|
defined(CONFIG_CPU_ARM925T) || defined(CONFIG_CPU_ARM1020) || \
|
|
defined(CONFIG_CPU_ARM1026)
|
|
# define MULTI_CACHE 1
|
|
#endif
|
|
|
|
#if defined(CONFIG_CPU_FA526)
|
|
# ifdef _CACHE
|
|
# define MULTI_CACHE 1
|
|
# else
|
|
# define _CACHE fa
|
|
# endif
|
|
#endif
|
|
|
|
#if defined(CONFIG_CPU_ARM926T)
|
|
# ifdef _CACHE
|
|
# define MULTI_CACHE 1
|
|
# else
|
|
# define _CACHE arm926
|
|
# endif
|
|
#endif
|
|
|
|
#if defined(CONFIG_CPU_ARM940T)
|
|
# ifdef _CACHE
|
|
# define MULTI_CACHE 1
|
|
# else
|
|
# define _CACHE arm940
|
|
# endif
|
|
#endif
|
|
|
|
#if defined(CONFIG_CPU_ARM946E)
|
|
# ifdef _CACHE
|
|
# define MULTI_CACHE 1
|
|
# else
|
|
# define _CACHE arm946
|
|
# endif
|
|
#endif
|
|
|
|
#if defined(CONFIG_CPU_CACHE_V4WB)
|
|
# ifdef _CACHE
|
|
# define MULTI_CACHE 1
|
|
# else
|
|
# define _CACHE v4wb
|
|
# endif
|
|
#endif
|
|
|
|
#if defined(CONFIG_CPU_XSCALE)
|
|
# ifdef _CACHE
|
|
# define MULTI_CACHE 1
|
|
# else
|
|
# define _CACHE xscale
|
|
# endif
|
|
#endif
|
|
|
|
#if defined(CONFIG_CPU_XSC3)
|
|
# ifdef _CACHE
|
|
# define MULTI_CACHE 1
|
|
# else
|
|
# define _CACHE xsc3
|
|
# endif
|
|
#endif
|
|
|
|
#if defined(CONFIG_CPU_MOHAWK)
|
|
# ifdef _CACHE
|
|
# define MULTI_CACHE 1
|
|
# else
|
|
# define _CACHE mohawk
|
|
# endif
|
|
#endif
|
|
|
|
#if defined(CONFIG_CPU_FEROCEON)
|
|
# define MULTI_CACHE 1
|
|
#endif
|
|
|
|
#if defined(CONFIG_CPU_V6) || defined(CONFIG_CPU_V6K)
|
|
# ifdef _CACHE
|
|
# define MULTI_CACHE 1
|
|
# else
|
|
# define _CACHE v6
|
|
# endif
|
|
#endif
|
|
|
|
#if defined(CONFIG_CPU_V7)
|
|
# ifdef _CACHE
|
|
# define MULTI_CACHE 1
|
|
# else
|
|
# define _CACHE v7
|
|
# endif
|
|
#endif
|
|
|
|
#if defined(CONFIG_CACHE_B15_RAC)
|
|
# define MULTI_CACHE 1
|
|
#endif
|
|
|
|
#if defined(CONFIG_CPU_V7M)
|
|
# define MULTI_CACHE 1
|
|
#endif
|
|
|
|
#if !defined(_CACHE) && !defined(MULTI_CACHE)
|
|
#error Unknown cache maintenance model
|
|
#endif
|
|
|
|
#ifndef __ASSEMBLER__
|
|
static inline void nop_flush_icache_all(void) { }
|
|
static inline void nop_flush_kern_cache_all(void) { }
|
|
static inline void nop_flush_kern_cache_louis(void) { }
|
|
static inline void nop_flush_user_cache_all(void) { }
|
|
static inline void nop_flush_user_cache_range(unsigned long a,
|
|
unsigned long b, unsigned int c) { }
|
|
|
|
static inline void nop_coherent_kern_range(unsigned long a, unsigned long b) { }
|
|
static inline int nop_coherent_user_range(unsigned long a,
|
|
unsigned long b) { return 0; }
|
|
static inline void nop_flush_kern_dcache_area(void *a, size_t s) { }
|
|
|
|
static inline void nop_dma_flush_range(const void *a, const void *b) { }
|
|
|
|
static inline void nop_dma_map_area(const void *s, size_t l, int f) { }
|
|
static inline void nop_dma_unmap_area(const void *s, size_t l, int f) { }
|
|
#endif
|
|
|
|
#ifndef MULTI_CACHE
|
|
#define __cpuc_flush_icache_all __glue(_CACHE,_flush_icache_all)
|
|
#define __cpuc_flush_kern_all __glue(_CACHE,_flush_kern_cache_all)
|
|
#define __cpuc_flush_kern_louis __glue(_CACHE,_flush_kern_cache_louis)
|
|
#define __cpuc_flush_user_all __glue(_CACHE,_flush_user_cache_all)
|
|
#define __cpuc_flush_user_range __glue(_CACHE,_flush_user_cache_range)
|
|
#define __cpuc_coherent_kern_range __glue(_CACHE,_coherent_kern_range)
|
|
#define __cpuc_coherent_user_range __glue(_CACHE,_coherent_user_range)
|
|
#define __cpuc_flush_dcache_area __glue(_CACHE,_flush_kern_dcache_area)
|
|
|
|
#define dmac_flush_range __glue(_CACHE,_dma_flush_range)
|
|
#endif
|
|
|
|
#endif
|