linux/arch/arm/include/asm/outercache.h
<<
>>
Prefs
   1/*
   2 * arch/arm/include/asm/outercache.h
   3 *
   4 * Copyright (C) 2010 ARM Ltd.
   5 * Written by Catalin Marinas <catalin.marinas@arm.com>
   6 *
   7 * This program is free software; you can redistribute it and/or modify
   8 * it under the terms of the GNU General Public License version 2 as
   9 * published by the Free Software Foundation.
  10 *
  11 * This program is distributed in the hope that it will be useful,
  12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14 * GNU General Public License for more details.
  15 *
  16 * You should have received a copy of the GNU General Public License
  17 * along with this program; if not, write to the Free Software
  18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  19 */
  20
  21#ifndef __ASM_OUTERCACHE_H
  22#define __ASM_OUTERCACHE_H
  23
  24#include <linux/types.h>
  25
  26struct outer_cache_fns {
  27        void (*inv_range)(unsigned long, unsigned long);
  28        void (*clean_range)(unsigned long, unsigned long);
  29        void (*flush_range)(unsigned long, unsigned long);
  30        void (*flush_all)(void);
  31        void (*inv_all)(void);
  32        void (*disable)(void);
  33#ifdef CONFIG_OUTER_CACHE_SYNC
  34        void (*sync)(void);
  35#endif
  36        void (*set_debug)(unsigned long);
  37        void (*resume)(void);
  38};
  39
  40extern struct outer_cache_fns outer_cache;
  41
  42#ifdef CONFIG_OUTER_CACHE
  43
  44static inline void outer_inv_range(phys_addr_t start, phys_addr_t end)
  45{
  46        if (outer_cache.inv_range)
  47                outer_cache.inv_range(start, end);
  48}
  49static inline void outer_clean_range(phys_addr_t start, phys_addr_t end)
  50{
  51        if (outer_cache.clean_range)
  52                outer_cache.clean_range(start, end);
  53}
  54static inline void outer_flush_range(phys_addr_t start, phys_addr_t end)
  55{
  56        if (outer_cache.flush_range)
  57                outer_cache.flush_range(start, end);
  58}
  59
  60static inline void outer_flush_all(void)
  61{
  62        if (outer_cache.flush_all)
  63                outer_cache.flush_all();
  64}
  65
  66static inline void outer_inv_all(void)
  67{
  68        if (outer_cache.inv_all)
  69                outer_cache.inv_all();
  70}
  71
  72static inline void outer_disable(void)
  73{
  74        if (outer_cache.disable)
  75                outer_cache.disable();
  76}
  77
  78static inline void outer_resume(void)
  79{
  80        if (outer_cache.resume)
  81                outer_cache.resume();
  82}
  83
  84#else
  85
  86static inline void outer_inv_range(phys_addr_t start, phys_addr_t end)
  87{ }
  88static inline void outer_clean_range(phys_addr_t start, phys_addr_t end)
  89{ }
  90static inline void outer_flush_range(phys_addr_t start, phys_addr_t end)
  91{ }
  92static inline void outer_flush_all(void) { }
  93static inline void outer_inv_all(void) { }
  94static inline void outer_disable(void) { }
  95static inline void outer_resume(void) { }
  96
  97#endif
  98
  99#ifdef CONFIG_OUTER_CACHE_SYNC
 100static inline void outer_sync(void)
 101{
 102        if (outer_cache.sync)
 103                outer_cache.sync();
 104}
 105#else
 106static inline void outer_sync(void)
 107{ }
 108#endif
 109
 110#endif  /* __ASM_OUTERCACHE_H */
 111